私は宿題からこの質問をしようとしています:
任意の場合、リストとペアを含め
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)