在haskell的类型

sha*_*har 4 string haskell typeclass

我是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
Run Code Online (Sandbox Code Playgroud)

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

dav*_*420 11

类型签名应该是

ed :: (Eq a, Integral b) => [a] -> [a] -> b
Run Code Online (Sandbox Code Playgroud)

这是因为您的定义ed包括表达式x == y.xy两者都具有类型a; 要能够测试它们是否相等,这种类型必须实现Eq类型类,它提供了==/=运营商.

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

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
Run Code Online (Sandbox Code Playgroud)

这是试图告诉你的.

(顺便说一下,当字符串长度不同时,你的代码不处理这种情况.)

  • @shashydhar`ed ::(Eq a)=> [a] - > [a] - > Int`也可以,只有你需要能够有不同类型的返回值(`Int`,`Integer `,`Word`,...)你需要在结果类型中保持多态. (4认同)