标签: overloaded-lists

为什么 IsList 需要 toList?

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

这似乎非常不一致。

haskell overloaded-strings overloaded-lists

9
推荐指数
1
解决办法
149
查看次数

顶级 OverloadedLists 文字

我有一个用于重构练习的测试套件,我希望它与Data.ListData.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)

haskell overloaded-lists

7
推荐指数
1
解决办法
90
查看次数