我有一個[字符]:拉鍊[字符]和IO [字符]
*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'是一個符號; 'buildIOMap2' - 是liftM - 的實現。
爲什麼我在三種情況下得到不同的結果?
你可以使用'do'符號並提取裏面的'key'或者''liftM''zip'的結果... – kennytm
對不起,我是Haskell的新手。你能舉個例子嗎? – demas