我有个查
*Main> let message = "something"我已经洗牌了字符串(您可以找到here的完整代码):
*Main> let key = shuffle message
*Main> message
"something"
*Main> :t message
message :: [Char]
*Main> key
"goeimntsh"
*Main> :t key
key :: IO [Char]现在,我需要从这两个字符串创建Data.Map。类似于:
Map.fromList(zip message key)但我连查尔和IO查都不能
*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 :),但是现在还有一个额外的问题:
*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 -实现。
为什么我在三种情况下得到不同的结果?
发布于 2012-10-30 06:53:29
从GHCi提示符中,您只需做
> key <- shuffle message这将在右侧运行IO操作,并将结果存储在key中,后者现在只是一个普通字符串。
> :t key
key :: [Char]另一方面,当你写
> let key = shuffle message您所做的只是命名该操作,因此您可以多次运行它并获得不同的结果:
> :t key
key :: IO [Char]
> key
"ntimshgoe"
> key
"gimhntoes"在GHCi中,计算值和运行操作之间的区别有点模糊,因为它允许您从相同的提示符中执行这两种操作。但是,如果尝试将错误的方式与zip示例混合,您将得到一个类型错误。
发布于 2012-10-30 06:27:31
表达式key不是[Char] --它是IO [Char] --即返回[Char]的IO计算。下面是一个如何使用洗牌功能的示例:
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在某种意义上,<-将IO从IO [Char]中展开,并将返回的值放置到<-的左边的变量中。
https://stackoverflow.com/questions/13133367
复制相似问题