- 関数型プログラミング言語Haskell Part33
323 :デフォルトの名無しさん[sage]:2020/05/23(土) 00:35:45.46 ID:PUmkxvlF - 次のように、一つのモナドを遅延的に無限に評価できる関数 repM は定義できるでしょうか?
repM :: (Monad) => m a -> m [a] xs <- repM (return 1) print $ take 3 xs -- [1, 1, 1] ys <- take 2 <$> repM (return 1) print ys -- [1, 1]
| - 関数型プログラミング言語Haskell Part33
326 :デフォルトの名無しさん[sage]:2020/05/23(土) 01:56:13.86 ID:PUmkxvlF - >>324
>>325 それはひとつのモナドを3回評価しているのではなく、 ひとつのモナドの中の値を3回評価しているのではないでしょうか? 例えば repM (getLine >>= print) を評価すると、 1回しか getLine >>= print を評価しません。 ちなみに、IOモナドに限れば unsafeInterleaveIO 関数が使えます。 また、リストではなくいわゆるストリームなら出来ました。 ですが今はモナド全般に適用でき、リストのモナドを返す関数を求めています。
| - 関数型プログラミング言語Haskell Part33
327 :デフォルトの名無しさん[sage]:2020/05/23(土) 02:01:15.20 ID:PUmkxvlF - >>324
すいません。 補足です。 a <- take 3 <$> repM (getLine >>= print) を評価すれば、 3回の副作用 getLine >>= print が実行され、 a は [(), (), ()] を束縛していて欲しいのです。
|
|