1

我正在尝试创建一个函数,该函数将删除字符串中给定字符的所有出现,但作为 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

有人可以帮忙吗?

4

1 回答 1

1

类型签名表示remove接受两个参数, aChar和 a String,并返回 a Int

错误消息指的是第二个等式,它试图将第一个参数 (a Char) 与(char : list)(a list) 匹配。

也许你的意思是

remove char list = ...

?

更多错误:

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

    也许这应该是

    remove _ [] = ...
    

    _意味着匹配任何东西。)

  2. 类型签名表示结果是Int,但您的方程式给出了String结果。

还有更多的错误。但这会让你开始。


编辑:针对您的第一条评论:

  1. 类型签名应该是

    remove :: Char -> String -> String
    

    remove接受 aChar和 aString并返回 a String

    当你放remove :: Char -> String时,这意味着remove需要 aChar并返回 a String

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

    是相同的(\elm -> (==) elm)

    是相同的(\elm birch -> (==) elm birch)

    是相同的(\elm birch -> elm == birch)

    也一样(==)

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

    (这就是错误消息告诉您的内容。)

于 2012-12-20T19:14:13.090 回答