News for hackers. Stuff that matters.
Re:The Java type system is broken by stingraycharles on Thursday July 19, 2018 @09:48AM (#17566198)
Wouldn't that be a problem in most languages? Even Haskell allows for it through Data.Dynamic

If I can serialize to String, and then deserialize a String to any type of class, I can effectively "cast" anything to anything.

Re:The Java type system is broken by lmm on Thursday July 19, 2018 @10:20AM (#17566501)
The point is not that you can do explicit casts, it's that because you can form a (fake) instance for impossible types you can do invalid type conversions without doing anything that looks unsafe.

In Haskell you can certainly achieve the same thing with various common extensions ( http://okmij.org/ftp/Haskell/impredicativity-bites.html ). Possibly not in vanilla Haskell '98, at the price of being not a very nice language to work in. (A total language like Idris should permit GADT-like functionality without allowing this kind of issue).

Re:The Java type system is broken by Tarean on Thursday July 19, 2018 @06:30PM (#17570910)
The actual correspondence in haskell are GADTs:

    data EqualityProof a b where
        Refl :: (a ~ b) => EqualityProof a b

    -- compiler error because we don't check that the equality proof is actually Refl
    coerce :: EqualityProof a b -> a -> b
    coerce _ a = a

    -- this works
    coerce Refl a = a

    -- here the Refl pattern match catches the undefined
    -- this is like forcing the programmer to do a null check before the equality is in scope
    -- and throwing a runtime exception when it's null
    coerce undefinded 3 :: String
Re:The Java type system is broken by TazeTSchnitzel on Thursday July 19, 2018 @09:51AM (#17566220)
By “convert” here I mean convince the compiler that any thing of type A is any type B, when it definitely isn't, without using an explicit cast.
Re:The Java type system is broken by tathougies on Thursday July 19, 2018 @12:06PM (#17567614)
Data.Dynamic is type safe. It performs a run-time type check.

Haskell can be made to be unsound using 'unsafeCoerce', but as you'll note, there is a giant unsafe in front of it.

Re:The Java type system is broken by chowells on Thursday July 19, 2018 @08:12PM (#17571467)
Haskell is unsound because of 'undefined :: a'. There you go - a proof of every proposition by the Curry-Howard isomorphism.

It's still safe, though, as it diverges at run time. Much like the ClassCastException coming from the JVM prevents the unsoundness in the original article from being a safety error.

'unsafeCoerce' (and things that can implement it, like creating a polymorphic mutable cell with 'unsafePerformIO') are worse than unsound - they are also unsafe.

Re:The Java type system is broken by J-Kuhn on Thursday July 19, 2018 @11:46AM (#17567386)
Read about Bottom (⊥).

null can be considered bottom (if it were not for primitives)