Saya bermain-main sedikit mencoba memahami conduit. Berlari

runConduit $ yield "abc" .| mapC id .| sinkList

Memberikan ["abc"], sambil berlari

runConduit $ yield "abc" .| mapMC id .| sinkList

Memberikan ["a", "b", "c"].

Mengapa versi monadik membagi aliran?

2
jorgen 19 November 2017, 13:56

1 menjawab

Jawaban Terbaik

Ini ada hubungannya dengan tipe-tipe yang dimainkan di sini. mapC mengharapkan fungsi bertipe a -> b, sedangkan mapMC mengharapkan a -> m b untuk beberapa instance Monad m. Dalam kedua kasus, Anda menggunakan id sebagai fungsi tersebut, dan oleh karena itu input apa pun yang Anda berikan akan diperlakukan sebagai b pada contoh pertama, dan m b pada contoh kedua. Karena nilai yang Anda hasilkan bertipe [Char], ini dipecah menjadi:

  • Contoh pertama adalah transformasi murni pada daftar karakter
  • Contoh kedua adalah transformasi monadik pada satu karakter, di dalam daftar monad

Jika Anda ingin contoh kedua berperilaku sama dengan yang pertama, ganti id dengan pure (atau return).

3
Michael Snoyman 19 November 2017, 11:16