2

ファイルの内容を取得し、それをフォームのリストに変換しています。

[("abc", 123), ("def", 456)]

readFile、行、および単語を使用します。

今のところ、結果のリストをタイプIO [(String、Int)]に変換することができます。

私の問題は、次のような関数を作成しようとすると、次のようになります。

check x = lookup x theMap

このエラーが発生しますが、解決方法がよくわかりません。

Couldn't match expected type `[(a0, b0)]'
            with actual type `IO [(String, Int)]'
In the second argument of `lookup', namely `theMap'

theMapは本質的にこれです:

getLines :: String -> IO [String]
getLines = liftM lines . readFile

tuplify [x,y] = (x, read y :: Int)

theMap = do
    list <- getLines "./test.txt"
    let l = map tuplify (map words list)
    return l

そして、ファイルの内容は次のとおりです。

abc 123
def 456

誰かが私が間違っていることを説明したり、より良い解決策を教えてもらえますか?私は数時間前にモナドをいじり始めたばかりで、途中でいくつかのバンプに遭遇しています。

ありがとう

4

1 に答える 1

4

theMapIOから「アンラップ」する必要があります。次の方法でこれをすでに行っていることに注意してくださいgetLines

do
  list <- getlines
  [...]
  return (some computation on list)

だからあなたは持つことができます:

check x = do
  m <- theMap
  return . lookup x $ m

これは実際にはアンチパターンであり(例示的なものではありますが)、ファンクターインスタンスを使用する方がよいでしょう。check x = fmap (lookup x) theMap

于 2012-10-17T09:11:46.033 に答える