レンズからmakeFields
を使用して、さまざまな構造にオーバーロードされたフィールドを生成しています。これらのフィールドを、複数の構造を持つフィールドで使用したいと考えていますが、どのフィールドを1回だけ使用したいのかを述べる必要があります。makeFieldsの任意の引数を同じ関数内の異なる型で使用する方法は?
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
import Control.Lens
data A = A
{ _aX :: String
, _aY :: String
}
makeFields ''A
data B = B
{ _bX :: String -> Char
, _bY :: String -> Bool
}
makeFields ''B
-- x can get _aX from an A and _bX from a B
a :: A
a = undefined
b :: B
b = undefined
q :: (Getter A String) AND (Getter B (String -> a)) -> a
q lens = (b^.lens) (a^.lens)
どのようなタイプを指定すればよいですかq
?私はGHCに型を推測させようとしましたが、失敗しました。
GHCi> :t x
x :: (HasX s a, Functor f) => (a -> f a) -> s -> f s
すべてのx
-bearingのタイプをカバーするので、抽象化(抽象化I:どう処理するかを決定する
'(b^.lens)a^.lens' ='((b^.lens)a)^。あなたはおそらく '(b^.lens)(a^.lens)'を望むでしょう。しかし、 '(Getter X Y、...)'型は有効ではないので(impadicative)、 'ReifiedGetter'やライター' Getter A ..-> Getter B ..-> .. 'を使う必要があります。 – user2407038
@ 2426021684なぜ2つの「ゲッター」が_same_レンズである必要がありますか? –
@BenjaminHodgson同じレンズを関数に2回渡す必要はありません。 – 2426021684