首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zip [Char]和IO [Char]

zip [Char]和IO [Char]
EN

Stack Overflow用户
提问于 2012-10-30 05:47:49
回答 2查看 1K关注 0票数 1

我有个查

代码语言:javascript
复制
*Main> let message = "something"

我已经洗牌了字符串(您可以找到here的完整代码):

代码语言:javascript
复制
*Main> let key = shuffle message

*Main> message
"something"

*Main> :t message
message :: [Char]

*Main> key 
"goeimntsh"

*Main> :t key
key :: IO [Char]

现在,我需要从这两个字符串创建Data.Map。类似于:

代码语言:javascript
复制
Map.fromList(zip message key)

但我连查尔和IO查都不能

代码语言:javascript
复制
*Main> zip message key
<interactive>:1:13:
    Couldn't match expected type `[b0]' with actual type `IO [Char]'
    In the second argument of `zip', namely `key'
    In the expression: zip message key
    In an equation for `it': it = zip message key

我知道洗牌函数不会为相同的输入返回相同的结果。所以它必须返回IO Char。

我知道我不能得到Map.Map,我同意获得IO Map.Map。但是我需要和普通字符串一样使用IO Char。我怎么才能拿到呢?

谢谢。

更新:

谢谢你们的解释。另有一些问题:

@KennyTM:

我理解“do”-表示法,但我需要一点时间来获得liftM :),但是现在还有一个额外的问题:

代码语言:javascript
复制
*Main> let s = "abcdef"
*Main> let d = shuffle s
*Main> s
"abcdef"
*Main> d
"fedcba"
*Main> buildIOMap s d
fromList [('a','e'),('b','a'),('c','c'),('d','f'),('e','d'),('f','b')]
*Main> buildIOMap2 s d
fromList [('a','c'),('b','b'),('c','f'),('d','a'),('e','e'),('f','d')]
*Main> Map.fromList (zip "abcdef" "fedcba")
fromList [('a','f'),('b','e'),('c','d'),('d','c'),('e','b'),('f','a')]

'buildIOMap‘是do-表示法;'buildIOMap2’-是liftM -实现。

为什么我在三种情况下得到不同的结果?

EN

回答 2

Stack Overflow用户

发布于 2012-10-30 06:53:29

从GHCi提示符中,您只需做

代码语言:javascript
复制
> key <- shuffle message

这将在右侧运行IO操作,并将结果存储在key中,后者现在只是一个普通字符串。

代码语言:javascript
复制
> :t key
key :: [Char]

另一方面,当你写

代码语言:javascript
复制
> let key = shuffle message

您所做的只是命名该操作,因此您可以多次运行它并获得不同的结果:

代码语言:javascript
复制
> :t key
key :: IO [Char]
> key
"ntimshgoe"
> key
"gimhntoes"

在GHCi中,计算值和运行操作之间的区别有点模糊,因为它允许您从相同的提示符中执行这两种操作。但是,如果尝试将错误的方式与zip示例混合,您将得到一个类型错误。

票数 4
EN

Stack Overflow用户

发布于 2012-10-30 06:27:31

表达式key不是[Char] --它是IO [Char] --即返回[Char]的IO计算。下面是一个如何使用洗牌功能的示例:

代码语言:javascript
复制
main = do let message = "something"
          key <- shuffle message
          -- now key is a [Char]
          let m = Data.Map.fromList (zip message key)
          print m -- ... or whatever

在某种意义上,<-IOIO [Char]中展开,并将返回的值放置到<-的左边的变量中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13133367

复制
相关文章

相似问题

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