KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I was experimenting with type families yesterday and ran into an obstacle with the following code: {-# LANGUAGE TypeFamilies #-} class C a where type A a myLength :: A a -> Int instance C String where type A String = [String] myLength = length instance C Int where type A Int = [Int] myLength = length main = let a1 = [1,2,3] a2 = ["hello","world"] in print (myLength a1) >> print (myLength a2) Here I have a type associated with class C and a function that calculates the length of the associated type. However the above code gives me this error: /tmp/type-families.hs:18:30: Couldn't match type `A a1' with `[a]' In the first argument of `myLength', namely `a1' In the first argument of `print', namely `(myLength a1)' In the first argument of `(>>)', namely `print (myLength a1)' /tmp/type-families.hs:19:30: Couldn't match type `A a2' with `[[Char]]' In the first argument of `myLength', namely `a2' In the first argument of `print', namely `(myLength a2)' In the second argument of `(>>)', namely `print (myLength a2)' Failed, modules loaded: none. If, however I change "type" to "data" the code compiles and works: {-# LANGUAGE TypeFamilies #-} class C a where data A a myLength :: A a -> Int instance C String where data A String = S [String] myLength (S a) = length a instance C Int where data A Int = I [Int] myLength (I a) = length a main = let a1 = I [1,2,3] a2 = S ["hello","world"] in print (myLength a1) >> print (myLength a2) Why does "length" not work as expected in the first case? The lines "type A String ..." and "type A Int ..." specify that the type "A a" is a list so myLength should have the following types
Tags (comma-separated)
Save Edits
Cancel