Haskell字符串过滤函数

3
有没有一种方法可以像这样在字符串上使用过滤函数:
filter (=="!") "!!some!!_!!string!!"

应该输出"some_string"(如上例)。现在我只得到了一个类型错误:

Couldn't match expected type `[Char]' against inferred type `Char'

如果我将第二个筛选器参数类型更改为 ["!!一些!!_!!字符串!!"],类型错误就会消失,但只输出一个空列表。(不完全是我想要的)
我以为字符串就是列表,但显然"!!一些!!_!!字符串!!"不被视为列表而是字符。
有什么提示吗?
1个回答

11
Prelude> filter (/='!') "!!some!!_!!string!!"
"some_string"

filter 的类型是 (a -> Bool) -> [a] -> [a]。由于第二个参数是一个 String = [Char],也就是说 [a] = String = [Char],我们推断出 a 必须是一个 Char。所以该函数必须以一个 Char 作为输入。因此,你需要使用 '!' 而不是 "!"


1
毋庸置疑,你可以对Hindley-Milner-ish类型系统有所评价,但它们确实使类型签名更加有用。 - user395760
我并不是在说什么,我只是希望我的代码能够轻松运行。而强类型和函数式编程的结合也有其缺点。 - kiltek
3
你是说需要表达自己的意思时会遇到困难?这不是一个琐碎的错误。你要求删除列表中所有与列表元素明显不同的内容,这是一个漏洞。类型系统在编译时就发现了这个问题,这对我来说是一个相当好的交易。 - Carl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接