- 関数型プログラミング言語Haskell Part27_©2ch.net
353 :デフォルトの名無しさん[]:2015/01/30(金) 09:18:18.88 ID:gVgHpLV/ - >>350,351
そこは別に短い方にあわせれば問題ない。zipと一緒。 この定義でもAplicativeにできることは確認した。 ただ、zipWith ($) fs xs で充分なんで使いドコロがあまりない。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
355 :デフォルトの名無しさん[]:2015/01/30(金) 10:37:10.94 ID:gVgHpLV/ - >>354
型定義からは、関数のリスト[a->b]をリスト[a]からリスト[b]への関数にするだけなんで、 素直でないとはいえない。 リストをタプルの拡張みたいなものとして考えればむしろ自然。 ただ、pure x を「ミニマルな無限リスト repeat x」と考える必要がでてくるだけ。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
357 :デフォルトの名無しさん[]:2015/01/30(金) 11:28:37.14 ID:gVgHpLV/ - >>356
>リストの順序を変えると結果が変わる 普通のApplicativeだって、結果のリストの順序は変わるから結果は変わるだろ。 非決定性の計算として見た場合にはリスト内の順序が重要ではないとはいえ。 順序対として見た場合に順序が変わると結果が変わるのは当然、というかそうでないと困る。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
358 :デフォルトの名無しさん[]:2015/01/30(金) 11:54:16.82 ID:gVgHpLV/ - あ、だいたいzip型のApplicativeの原理を理解した気がする。
[a] は Int -> a な(部分)関数と等価、 [a->b] は Int -> (a->b) と等価なので、 [a->b]<*>[a] の <*> を Int -> a と Int -> (a->b) から Int -> b を合成する関数とみれば、 実はこの <*> は (->)Applicative の <*> そのものになるんだ。 なんで、同様にして(->) Monadと同じような構造を持ったMonadも作れるはず。 ただ、あくまで部分関数なので、そこのところをMaybeと同様に処理してやらなきゃいけないだろうけど。
|
- 関数型プログラミング言語Haskell Part27_©2ch.net
360 :デフォルトの名無しさん[]:2015/01/30(金) 12:39:02.10 ID:gVgHpLV/ - >>359
>Control.Applicative.ZipList >join を diagonal とすれば対応するモナドが出る それだと長さが違うリストの時にdiagonalが取れないのだよ。 各リストの長さを無理やり揃えて足りない分はNothingで埋めるみたいなことをしないといかん。 で、そのNothingを放置できないので最終結果から削ったりとかするとMonad Lawsが破れる……
|