使用ListLike的不明确的类型

时间:2011-06-19 20:38:05

标签: haskell types type-inference strong-typing

我正在Haskell中编写一个函数,用ListLikeOrd元素制作直方图:

import qualified Data.ListLike as LL
...
frequencies :: (Ord x, LL.ListLike xs x) => xs -> [(x, Int)]
frequencies xs = LL.map (\x->(LL.head x, LL.length x)) $ LL.group $ LL.sort xs

当尝试编译上面的代码时,我收到有关模糊类型的错误消息:

 Ambiguous type variable `full0' in the constraint:
 (LL.ListLike full0 xs) arising from a use of `LL.group'
 Probable fix: add a type signature that fixes these type variable(s)
 In the expression: LL.group
 In the second argument of `($)', namely `LL.group $ LL.sort xs'
 In the expression:
 LL.map (\ x -> (LL.head x, LL.length x)) $ LL.group $ LL.sort xs

LL.group的类型(ListLike full0 full, ListLike full item, Eq item) => full -> full0对应(Eq a) => [a]->[[a]]就普通列表而言。

我不明白为什么有这种类型的问题。 Haskell是否无法推断存在“ListLike with full as elements”这样的类型,即full0

1 个答案:

答案 0 :(得分:6)

  

Haskell是否无法推断存在“ListLike full作为元素”这样的类型,即full0

不,问题是选择full0的类型太多而且Haskell编译器不知道使用哪个类型。考虑一下:通常,可以有多个full0类型,类似于列表的类型,full作为元素:[full]Data.Sequence.Seq full或许多其他选项。由于LL.map定义的一般性,full0 从函数[full]的返回类型约束为frequencies

如果您想将full0限制为[full],则执行此操作的一种方法是将LL.map的定义中的frequencies替换为普通的map对于列表。