我正在尝试创建一个函数,它将删除字符串中所有出现的给定字符,但作为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
有人可以帮忙吗?
答案 0 :(得分:1)
类型签名表示remove
有两个参数:Char
和String
,并返回Int
。
错误消息引用第二个等式,它尝试将第一个参数(Char
)与(char : list)
(列表)匹配。
也许你的意思是
remove char list = ...
进一步的错误:
第一个等式产生同样的错误(尝试将空列表与Char
参数匹配)。
也许这应该是
remove _ [] = ...
(_
表示匹配任何内容。)
类型签名表示结果为Int
,但您的公式会产生String
结果。
还有更多的错误。但那会让你开始。
修改:回复您的第一条评论:
类型签名应为
remove :: Char -> String -> String
remove
获取Char
和String
并返回String
。
当您添加remove :: Char -> String
时,这意味着remove
需要Char
并返回String
。
(\elm -> flip (==) elm)
与(\elm -> (==) elm)
与(\elm birch -> (==) elm birch)
与(\elm birch -> elm == birch)
也与(==)
相同。
此表达式的类型为a -> a -> Bool
,但您将它作为第一个参数传递给filter
,它需要一个类型为a -> Bool
的函数(即它需要一个函数参数,不是一个需要两个的函数。
(这是错误信息告诉你的内容。)