使用-XOverloadedStrings
时可以实现IsString
只需要一个函数fromString
。现在,如果您想使用字符串文字进行模式匹配,您还必须实现Eq
,这是有道理的:
f :: MyString -> Bool
f "foo" = True
f _ = False
-- equivalent to
f x
| x == fromString "foo" = True
| otherwise = False
但是为什么使用的IsList
类型类-XOverloadedLists
需要你实现toList
呢?在wiki中,唯一提到的用例toList
是模式匹配。我知道这Eq
对于列表模式匹配是不够的。但是toList
应该在一个不同的类型类中,只有当你想使用与你的类型匹配的列表模式时才需要,就像不需要IsString
一样。 Eq
对我来说,令人讨厌的事情是fromList . toList = id
必须满足条件,但这对于某些类型(例如无序集合)根本无法保证,它不能保证元素的顺序保持不变。
这似乎非常不一致。