トップページ > プログラム > 2020年05月23日 > PUmkxvlF

書き込み順位&時間帯一覧

5 位/111 ID中時間01234567891011121314151617181920212223Total
書き込み数1110000000000000000000003



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
関数型プログラミング言語Haskell Part33

書き込みレス一覧

関数型プログラミング言語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 は [(), (), ()] を束縛していて欲しいのです。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。