私は余暇に Haskell を勉強しており、最近はモナド関数の領域にも足を踏み入れています。私が抱えている正確な問題を特定するために、私が取り組んできた演習からコードを抽出して、この非常に不自然な例にしました。
import System.Random
rndPermu :: [a] -> IO (a, [a])
rndPermu xs = (front, back)
where (front, back) = hurf xs
hurf :: [a] -> IO (a, [a])
hurf xs = randomRIO (0, (length xs) - 1) >>= \r -> return $ removeAt r xs
removeAt :: Int -> [a] -> (a, [a])
removeAt n xs = (e, rest)
where e = xs !! n
rest = take n xs ++ (tail $ drop n xs)
rndPermu は GHCi にロードされたときに型エラーを生成し、型 (t, t1) が 'where' 句で予期されていたが、IO (a, [a]) が受信されたことを示します。(liftM fst) のようなものを使用して、タプルから個々の項目を取得し、単一の値を割り当てることができますが、それは明らかにずさんで回りくどい方法です。私はおそらく、目の前にある構文の小さなニュアンスにつまずいているように感じます。このタイプのエラーをどのように解決しますか? モナドでラップされたタプルに対して直接マッチできるはずですよね?