News for hackers. Stuff that matters.
Re:Haskell tutorial for C programmers by DannoHung on Friday May 09, 2014 @05:25PM (#7723328)
How do you express the Ordinality constraint in C++?
Re:Haskell tutorial for C programmers by Rusky on Friday May 09, 2014 @05:49PM (#7723440)
The existence of an operator< or the existence of a template specialization. Not as nice, and incapable of runtime polymorphism, but that's typically how it's done. Concepts would have been more explicit about it but they're also compile-time only.

Interfaces or pure virtual classes are not the same because they're closed.

Re:Haskell tutorial for C programmers by GeneralMayhem on Friday May 09, 2014 @05:31PM (#7723360)
Multiple inheritance from a purely virtual class. In Java, they're called interfaces; Comparable is the analogue to Ord.

The advantage that Haskell's typeclasses have over either Java or C++ is that the types aren't closed. I can define a new typeclass and tell the compiler that a type you defined is a member of that class at any point. In Java, if you don't define that your type is Comparable, there's nothing that I, as a consumer of your type, can do about it.

Re:Haskell tutorial for C programmers by Peaker on Saturday May 10, 2014 @08:50AM (#7725210)
The advantage you mention is one of many (over OOP interfaces), I'll repeat it as (A).

(A) Ability to instantiate old types with new classes

(B) Conditional instantiation: "Maybe a" is an instance of "Show" iff "a" is an instance of "Show"

(C) Can do return-type polymorphism, or polymorphism on any part of the signature

(D) Objects do not need to pay for the interface vtable pointer. Large array of some type-class instance can be much smaller than an array of an OOP interface subclass.

(E) When comparing two Ord instance values, there is only one Ord dictionary, rather than 2 to choose from. No false dilemma.

Re:Haskell tutorial for C programmers by judk on Sunday May 11, 2014 @01:38AM (#7727893)
E) you do get a dilemma if you add two elements in a sorted structure , lexically in two different files, where two different Ord instances arr in scope, respectively. this function-is-instance problem is dual to OO's -object-is-instance problem.
Re:Haskell tutorial for C programmers by Peaker on Sunday May 11, 2014 @02:02AM (#7727939)
A homogenous list is guaranteed to only have one instance unless you enable incoherent instances (a known bad extension) or confuse the compiler with orphan instances (though I've never encountered this and think it should be detectable at link time anyway).

One type -> at most one instance for any class, in Haskell.

Re:Haskell tutorial for C programmers by GeneralMayhem on Sunday May 11, 2014 @12:29AM (#7727771)
(C) is covered by generics in most cases. The others, yes.
Re:Haskell tutorial for C programmers by judk on Sunday May 11, 2014 @01:39AM (#7727896)
Generics aren't ad-hoc polymorphic. Type classes are.
Re:Haskell tutorial for C programmers by chongli on Friday May 09, 2014 @07:24PM (#7723812)
Yeah, though you will want to be the owner of either the type class or the type itself. Instances which are neither are called orphan instances and they are generally frowned upon. Luckily, it's trivial to create a newtype wrapper which gives you a whole new set of hooks for writing instances of a type.
Re:Haskell tutorial for C programmers by dllthomas on Friday May 09, 2014 @08:35PM (#7724021)
Orphan instances in libraries are frowned upon. In an application they are more palatable, though a newtype might still be a better choice, depending.
Re:Haskell tutorial for C programmers by GeneralMayhem on Friday May 09, 2014 @09:10PM (#7724101)
That makes sense, but again, in Java you can't do it if you're just the owner of the typeclass, and in order to make a wrapper you'd have to make a subclass, which mucks with all kinds of other things.
Re:Haskell tutorial for C programmers by cozmorado on Friday May 09, 2014 @05:47PM (#7723437)
Concepts will accomplish this when they finally make it into the standard.
Re:Haskell tutorial for C programmers by pbsd on Friday May 09, 2014 @06:15PM (#7723526)
Concepts will certainly be nice once they arrive in the standard, but it is already possible today with some trickery. Example checking whether an std::vector<T>'s type is comparable with `operator<`: http://coliru.stacked-crooked.com/a/2ea46e0afd894d3d

The error you get if you try to sort a vector with an unordered type is relatively easy to read:

    main.cpp: In instantiation of 'void merge_sort(std::vector<_RealType>&) [with T = type]':
    main.cpp:45:17:   required from here
    main.cpp:30:5: error: static assertion failed: Element type is not sortable
         static_assert( concept::is_ord<T>(), "Element type is not sortable" );
         ^