パターンマッチングで合計型付き値を分解したくありません。その尖ったスタイルのために、私にとっては外人だと感じています。 私はむしろsum型のために関数switch
を書いて使います。GHCを使ったポイントフリーの構造化
私の質問は、一般的に任意の合計の種類についてですが、私は例としてEither
でそれを示しています。この拡張子を持つ
data Processor cl cr r = MakeProcessor { l :: cl -> r, r :: cr -> r }
switch :: Processor cl cr r -> Either cl cr -> r
switch p ei =
case ei of
Left x -> l p x
Right x -> r p x
Either
へ:これの代わりに
:
map f e =
case e of
Left x -> Left x
Right x -> Right (f x)
私はこれを書くことができます:
map f = switch (MakeProcessor { l : Left, r : f >>> Right })
私はほとんどの状況でより良い感じ。
このような拡張用のものを書くには、合計タイプの機械作業である[Processor
、switch
]。ですから、私はコンパイラ[GHC]を私のためにやる方法があるのだろうか?無意味な型で合計型の値を削除する方法はありますか?
注:例としてEither
を使用しました。 Either
は間違った選択でした。多くの読者が私の質問は約Either
だったと思っていたので、私はeither
と指摘しました。
switch p ei = either (l p) (r p) ei
:私はeither
機能を使用すると、Either a b
値にLeft
とRight
値に適用するために別々の機能を指定できます
data Result a b = Fail a | Success b
「レンズ」ライブラリが役立つ場合があります。 'map'関数を' over _Right'として書くことができます。 –
私は_RightがTemplateHaskellから来ると思いますよね?たぶんこれは厳しいですが、SafeHaskellと互換性がないため、私はTHを避けていました。 – libeako
私の「どちらかの」例は、パターンマッチングを避ける私の方法の単なる例です。これは、ベースライブラリ内の 'どちらか 'の関数のより安全なバージョンです。私の質問は特に「どちらか」に関するものではなく、例としてのみ使用します。 – libeako