4

我对 haskell 非常陌生,并试图实现一个小而简单的函数,它接受两个字符串并告诉我同一位置的相同字符的数量。

ed :: (Integral b) => [a] -> [a] -> b
ed _ [] = 0
ed [] _ = 0
ed [] [] = 0
ed (x:xs) (y:ys)
    | x == y = 1 + ed xs ys
    | otherwise = ed xs ys

这不会运行,因为我的类型类定义是错误的。我有两个字符串,需要返回一个整数,因此我上面写的类型类定义。还有什么我需要做的吗?

4

2 回答 2

11

类型签名应该是

ed :: (Eq a, Integral b) => [a] -> [a] -> b

这是因为您的定义ed包含表达式x == yx并且y都有类型a;为了能够测试它们是否相等,这种类型必须实现Eq提供了==and/=运算符的 typeclass。

您收到的错误消息将包括以下内容:

Could not deduce (Eq a) arising from a use of `=='
from the context (Integral b)
  bound by the type signature for ed :: Integral b => [a] -> [a] -> b
  at /home/dave/tmp/so.hs:(2,1)-(5,26)
Possible fix:
  add (Eq a) to the context of
    the type signature for ed :: Integral b => [a] -> [a] -> b

它试图告诉你这一点。

(顺便说一句,当字符串长度不同时,您的代码无法处理这种情况。)

于 2012-11-27T20:55:00.183 回答
4

由于 x == y,您需要添加一个 Eq 类型约束:

ed :: (Integral b, Eq a) => [a] -> [a] -> b

您可以注释掉类型签名,在 ghci 中加载您的模块并让它找出类型签名:

Main> :t ed
ed :: (Eq a1, Num a) => [a1] -> [a1] -> a
于 2012-11-27T20:59:48.217 回答