首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个函数中“做”多个事情

在一个函数中“做”多个事情
EN

Stack Overflow用户
提问于 2016-08-30 18:08:03
回答 2查看 3K关注 0票数 1

我是新来的

所以我开始工作了:

代码语言:javascript
复制
foo :: String -> String
foo s = do replace "aoa" "a" s

(键入foo "aoa"返回"a"__)

但当我加上另一个替代:

代码语言:javascript
复制
foo :: String -> String
foo s = do replace "aoa" "a" s
           replace "uou" "u" s

(键入foo "aoa"返回"aoa"__)

一切都坏了,我收到这样的警告:

代码语言:javascript
复制
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

示例:

代码语言:javascript
复制
"aoaaoa" -> "aa"   //Affected
"uouaoa" -> "ua"   //Affected
"aua" -> "aua"     //Not affected
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-30 18:20:13

您不需要使用do符号来实现简单的字符串替换。但是由于字符串是单变量,所以编译器假设您打算将字符串作为Monad使用,并在此假设下给出错误消息。

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

代码语言:javascript
复制
foo s = replace "uou" "u" (replace "aoa" "a" s)
票数 9
EN

Stack Overflow用户

发布于 2016-08-30 18:23:47

do-表示法是“单曲”的意思。在这种情况下,我更倾向于将函数调用链接在一起。

代码语言:javascript
复制
foo :: String -> String
foo s =
    let s' = replace "aoa" "a" s in
    replace "uou" "u" s'

由于Haskell变量是不可变的,所以我们不能用新值更新s,而必须每次都创建一个新变量。一个常见的成语是在变量名的末尾添加一个' --在Haskell中它是一个有效的变量名。

你也可以这样做:

代码语言:javascript
复制
foo :: String -> String
foo s =
    let s'  = replace "aoa" "a" s  in
    let s'' = replace "uou" "u" s' in
    s''
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39234327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档