私は宿題からこの質問をしようとしています:
任意の場合、リストとペアを含め
foo :: [[a]] -> ([a], [a])
、関数がfoo
満たす1つの法則を書き留めmap
ます。
いくつかのコンテキスト:私は関数型プログラミングのコースを受講する1年生です。コースはかなり入門的なものですが、講師はシラバスから多くのことを述べてきましたが、その中には自由定理があります。だから、Wadlerの論文を読むことを試みた後、私はそれを起算concat :: [[a]] -> [a]
法律をmap f . concat = concat . map (map f)
我々は持っている必要がありますから、私の問題に関連して見えるfoo xss = (concat xss, concat' xss)
場所concat
とconcat'
種類のいずれかの機能です[[a]] -> [a]
。次にをfoo
満たしbimap (map f, map g) . foo = \xss -> ((fst . foo . map (map f)) xss, (snd . foo . map (map g)) xss)
ます。
すでにこの「法則」は長すぎて正しくないように思われますが、自分の論理もよくわかりません。だから私はオンラインの無料の定理ジェネレーターを使うことを考えましたが、私は何をlift{(,)}
意味するのかわかりません:
forall t1,t2 in TYPES, g :: t1 -> t2.
forall x :: [[t1]].
(f x, f (map (map g) x)) in lift{(,)}(map g,map g)
lift{(,)}(map g,map g)
= {((x1, x2), (y1, y2)) | (map g x1 = y1) && (map g x2 = y2)}
この出力をどのように理解すればよいですか?そして、関数の法則をfoo
適切に導出するにはどうすればよいですか?
(\(a,b) -> (map f a, map f b)) . foo = foo . map (map f)