5

こんばんは。モナドに関するいくつかの説明を求めており、 bind を使用してください(コンポジットに入り.ます)。

したがって、この例では:

--Monadic parts:
readFile :: String -> IO File
putStr :: String -> IO()
-- Non monadic parts
toMatrix :: String -> CustomMatrix
toString :: CustomMatrix -> String

基本的に、ファイル ( ) を遅延して読み取り、readFileカスタム マトリックスを生成して、マトリックスを文字列出力に変換しています。その後、戻ります。

fileReading :: String -> IO
fileReading file = putStr(toString . toMatrix . readFile file)

これは、 bind >>=to go fromを使用して混乱を引き起こし始めたときreadFile fileです。.読めない混乱を招くことなく、コンポジットを引き続き使用し、バインドして構成する方法はありますか (実際には私の目的ではありません)。

いつものように、どんな助けもありがたく受け取っています。ありがとうございます。

4

1 に答える 1

8

この例では、いくつかのモナド関数 ( など)を使用せずに逃げることはできません>>=。実際にIOを実行したい場合は、IO値を使用して通常の関数構成を使用することはできません。

幸いなことに、コードをかなり読みやすく書くことができます。

fileReading file = readFile file >>= putStr . toString . toMatrix

これが機能するのは、2 つの.操作が 2 つの非 IO 関数を最終的な IO 関数と組み合わせているためです。その時点で、2 つの IO 値があります:IO StringString -> IO ()関数です (式全体putStr . toString . toMatrixがその型を持ちます)。これはまさに必要なことな>>=ので、準備は完了です。

コードを上記と同じ順序にしたい場合は、後方バインド演算子を使用できます。

fileReading file = putStr . toString . toMatrix =<< readFile file

すべてのコードが同じ方向に「流れる」ため、このバージョンの方が読みやすいと感じる人もいます。

于 2013-03-21T18:06:23.043 に答える