在功能中"做"多件事

Oli*_*n04 1 haskell

我是新来的.

所以我得到了这个工作:

foo :: String -> String
foo s = do replace "aoa" "a" s
Run Code Online (Sandbox Code Playgroud)

(键入foo "aoa"返回"a")
但是当我添加另一个替换:

foo :: String -> String
foo s = do replace "aoa" "a" s
           replace "uou" "u" s
Run Code Online (Sandbox Code Playgroud)

(打字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
Run Code Online (Sandbox Code Playgroud)

由于我不想压制警告,因此此错误消息对我没有任何意义.

我错过了什么?

Edit1
示例:

"aoaaoa" -> "aa"   //Affected
"uouaoa" -> "ua"   //Affected
"aua" -> "aua"     //Not affected
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 9

您不需要使用do符号来实现简单的字符串替换.但由于字符串是Monads,编译器假设您打算将字符串用作Monad并使用该假设给出错误消息.

如果你想简单地将两个调用链接在一起replace,你可以写:

foo s = replace "uou" "u" (replace "aoa" "a" s)
Run Code Online (Sandbox Code Playgroud)

  • 哦,所以第一个替换是使用第二个替换的答案作为其参数? (2认同)