使用时-XOverloadedStrings你可以实现IsString只需要一个函数fromString。现在,如果您想使用字符串文字进行模式匹配,您还必须实现Eq,这是有道理的:
f :: MyString -> Bool
f "foo" = True
f _ = False
-- equivalent to
f x
| x == fromString "foo" = True
| otherwise = False
Run Code Online (Sandbox Code Playgroud)
但是,为什么使用的IsList类型类-XOverloadedLists需要您实现toList?在wiki 中,唯一提到的用例toList是模式匹配。我知道这Eq对于列表模式匹配是不够的。但后来toList应该是在唯一需要不同类型的类,如果你想使用列表模式匹配与你的类型,就像IsString没有要求 Eq。
对我来说,令人讨厌的事情是fromList . toList = id必须满足条件,但是对于某些类型(例如无序集合,它不能保证元素的顺序保持不变),这根本无法保证。
这似乎非常不一致。
我有一个用于重构练习的测试套件,我希望它与Data.List和Data.List.NonEmpty. 练习由一个函数组成,foo :: [Foo] -> Foo测试套件有一些
data Case = Case
{ description :: String
, input :: [Foo]
, expected :: Foo
}
cases :: [Case]
cases =
[ Case { description = "blah blah"
, input = [Foo 1, Foo 2, Foo 3]
, expected = Foo 1
}
, ...
]
Run Code Online (Sandbox Code Playgroud)
为了使测试套件多态OverloadedLists,我试过
{-# LANGUAGE OverloadedLists #-}
...
data Case list = Case
{ description :: String
, input :: list …Run Code Online (Sandbox Code Playgroud)