"做"函数中的多个东西

时间:2016-08-30 18:08:04

标签: haskell

我是新人。

所以我得到了这个工作:

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

2 个答案:

答案 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''