我是新来的
所以我开始工作了:
foo :: String -> String
foo s = do replace "aoa" "a" s(键入foo "aoa"返回"a"__)
但当我加上另一个替代:
foo :: String -> String
foo s = do replace "aoa" "a" s
replace "uou" "u" s(键入foo "aoa"返回"aoa"__)
一切都坏了,我收到这样的警告:
A do-notation statement discarded a result of type ‘Char’
Suppress this warning by saying ‘_ <- replace "aoa" "a" s’
or by using the flag -fno-warn-unused-do-bind由于我不想压制警告,这条错误信息对我毫无意义。
我遗漏了什么?
Edit1
示例:
"aoaaoa" -> "aa" //Affected
"uouaoa" -> "ua" //Affected
"aua" -> "aua" //Not affected发布于 2016-08-30 18:20:13
您不需要使用do符号来实现简单的字符串替换。但是由于字符串是单变量,所以编译器假设您打算将字符串作为Monad使用,并在此假设下给出错误消息。
如果您想简单地将两个对replace的调用链接在一起,可以编写:
foo s = replace "uou" "u" (replace "aoa" "a" s)发布于 2016-08-30 18:23:47
do-表示法是“单曲”的意思。在这种情况下,我更倾向于将函数调用链接在一起。
foo :: String -> String
foo s =
let s' = replace "aoa" "a" s in
replace "uou" "u" s'由于Haskell变量是不可变的,所以我们不能用新值更新s,而必须每次都创建一个新变量。一个常见的成语是在变量名的末尾添加一个' --在Haskell中它是一个有效的变量名。
你也可以这样做:
foo :: String -> String
foo s =
let s' = replace "aoa" "a" s in
let s'' = replace "uou" "u" s' in
s''https://stackoverflow.com/questions/39234327
复制相似问题