Haskell:显式类型绑定中的类型错误

时间:2012-12-20 19:09:23

标签: haskell

我正在尝试创建一个函数,它将删除字符串中所有出现的给定字符,但作为Haskell业余爱好者,我遇到的问题使得它难以入睡。

这是我的代码:

remove:: Char -> String -> Int
remove[] = []
remove (char : list) = char : remove (filter (\elm -> not (char == elm) ) list)

使用类型定义,我得到以下错误代码:

ERROR "a5.hs":17 - Type error in explicitly typed binding
*** Term           : char : list
*** Type           : [a]
*** Does not match : Char

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

类型签名表示remove有两个参数:CharString,并返回Int

错误消息引用第二个等式,它尝试将第一个参数(Char)与(char : list)(列表)匹配。

也许你的意思是

remove char list = ...

进一步的错误:

  1. 第一个等式产生同样的错误(尝试将空列表与Char参数匹配)。

    也许这应该是

    remove _ [] = ...
    

    _表示匹配任何内容。)

  2. 类型签名表示结果为Int,但您的公式会产生String结果。

  3. 还有更多的错误。但那会让你开始。


    修改:回复您的第一条评论:

    1. 类型签名应为

      remove :: Char -> String -> String
      

      remove获取CharString并返回String

      当您添加remove :: Char -> String时,这意味着remove需要Char并返回String

    2. (\elm -> flip (==) elm)

      (\elm -> (==) elm)

      相同

      (\elm birch -> (==) elm birch)

      相同

      (\elm birch -> elm == birch)

      相同

      也与(==)相同。

      此表达式的类型为a -> a -> Bool,但您将它作为第一个参数传递给filter,它需要一个类型为a -> Bool的函数(即它需要一个函数参数,不是一个需要两个的函数。

      (这是错误信息告诉你的内容。)