私は[Char]を持っています:
*Main> let message = "something"
そして、私は文字列をシャッフルしました(ここで見つけることができる完全なコード):
*Main> let key = shuffle message
*Main> message
"something"
*Main> :t message
message :: [Char]
*Main> key
"goeimntsh"
*Main> :t key
key :: IO [Char]
次に、この 2 つの文字列から Data.Map を作成する必要があります。何かのようなもの:
Map.fromList(zip message key)
しかし、[Char] と IO [Char] を圧縮することさえできません。
*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] を扱う必要があります。どうすれば入手できますか?
ありがとう。
更新しました:
皆様、ご説明ありがとうございます。追加の質問:
@ケニーTM:
「do」表記は理解できましたが、liftM を取得するには少し時間が必要です :) しかし、現在、追加の質問が 1 つあります。
*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 - 実現です。
3 つのケースで異なる結果が得られるのはなぜですか?