我是新人。
所以我得到了这个工作:
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
答案 0 :(得分:9)
您无需使用do
表示法来实现简单的字符串替换。但由于字符串是Monads,编译器假设您打算将该字符串用作Monad并使用该假设给出错误消息。
如果您想简单地将两次调用链接到replace
,您可以写:
foo s = replace "uou" "u" (replace "aoa" "a" s)
答案 1 :(得分:2)
do-notation用于“monad stuff”。在这种情况下,我更愿意将函数调用链接在一起。
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''