使用-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必须满足条件,但这对于某些类型(例如无序集合)根本无法保证,它不能保证元素的顺序保持不变。
这似乎非常不一致。