2017-01-14 8 views
2

this questionでは、著者はHaskellでモルガンの法則の実装を書いています。私はnotAandnotBの実装を理解し、notAornotBが、私はあるnotAorBの実装を理解するのに苦労しています:モルガンの法則実装におけるHaskellドット(。)演算子

notAorB :: (Either a b -> c) -> (a -> c, b -> c) 
notAorB f = (f . Left, f . Right) 

誰かが(f . Left, f . Right)部分がどのように動作するかを説明してもらえますか?以前は.演算子が使用されていましたが、2つではなく3つの引数が使用されています。

ありがとうございます。

答えて

3

.オペレータの定義は(f . g) x = f (g x)であることを思い出して、f . g = \x -> f (g x)すなわち(文法的に、それはバイナリ演算子である、それはHaskellの構文糖はかつてのように修正再表示されるように、後者の定義を許可するだけのことです) 。だから、あなたが持っている定義は、いつものように

notAorB f = ((\x -> f (Left x)), (\y -> f (Right y))) 

(これは#haskellLambdabotによって機械的に行うことができ、@unpl ‹expr›に彼に言う)、またはより冗長

notAorB f = (lt, rt) 
    where lt x = f (Left x) 
     rt y = f (Right y) 

と言い換えることができますタイプを書き留めてみてください。 (.) :: ∀ s t u. (t -> u) -> (s -> t) -> s -> uf :: Either a b -> cLeft :: ∀ p q. p -> Either p q、その後、f . Leftまたは(.) f Left :: a -> cなど

+0

パーフェクトであれば、ご協力ありがとうございました! – helencrump

関連する問題