これが私のコードです:
doSomething :: IO Bool -> IO () -> IO ()
doSomething cond body = cond >>= ( \condition -> if condition then return else body )
それは私にこのエラーを与えます:
Couldn't match expected type `IO ()' with actual type `a0 -> m0 a0'
In the expression: return
In the expression: if condition then return else body
In the second argument of `(>>=)', namely
`(\ condition -> if condition then return else body)'
私もこの同等の表記法を試しました:
whileM :: IO Bool -> IO () -> IO ()
whileM cond body = do
condition <- cond
if condition then return else body
しかし、私は多かれ少なかれ同じ表記を得ています。エラーは、関数がモナドを返すことを期待していることを示していることを理解していますが、代わりにa0
モナドに変換する関数を返していますm a0
。どうすればこれを修正できますか?
(ほとんどすべての)他の言語とは異なり、Haskellでは、return
「このコードを終了して、それを呼び出した次の行に戻る」という意味ではありません。
Haskellでは、それは(大まかに)「これをモナドで包む」という意味です。do
表記のコンテキストでは、これは、制御が「呼び出し元」に戻されるコード内の場所で発生することがよくあります(繰り返しますが、これは実際には正しい単語ではありませんが、この例えで実行されます)。
したがって、return
ここにパラメーターが必要です(ラップするもの)...return
は型Monad m => a -> m a
ですが、関数は型を返しますIO ()
。したがって、まとめる必要があるのは、タイプ()
、つまり要素が1つしかないタイプ、「()」自体です。
に変更return
してreturn ()
、それが機能するかどうかを確認します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加