1
import Control.Lens

-- is there a way I can write top-level definitions
-- in an arbitrary order like
px = proto & _1 %~ asTypeOf '2'
py = proto & _2 %~ asTypeOf "2"
proto = (undefined, undefined)

-- but have types inferred like the following:
(qx,qy,qroto) = case (undefined, undefined) of
  qxy -> (qxy & _1 %~ asTypeOf '2',
          qxy & _2 %~ asTypeOf "2",
          qxy)

希望qroto :: (Char, [Char])の が得られますが、proto :: (t, t1)一般的すぎます。さらに重要なことに、これはpx :: (Char, t)代わりにqx :: (Char, [Char]).

より大きな問題は、 Data.HList.Variant.mkVariantの 3 番目の引数で必要な型注釈を削減できるようにしようとしていることです。

4

1 に答える 1

2

これを試して:

(dx,rx) = ((), rroto & _1 %~ asTypeOf '2')
(dy,ry) = ((), rroto & _2 %~ asTypeOf "2")
rroto = const (undefined, undefined) (dx,dy)

rx,ry,rrotoこれにより単形性が強制されます。

> :t px
px :: (Char, t)
> :t qx
qx :: (Char, [Char])
> :t rx
rx :: (Char, [Char])
> :t rroto
rroto :: (Char, [Char])

モノモーフィズムの制限を「トリガー」するには、相互に依存する一連の定義を使用する必要があります。つまり、すべての方程式は他の方程式に依存する必要があります。dx,dy上記では、依存関係を強制するために追加することでこれを取得します。


同じ効果を達成するためのより簡単な方法:

rx = rroto & _1 %~ asTypeOf '2'
ry = rroto & _2 %~ asTypeOf "2"
rroto = const (undefined, undefined) (rx,ry)
于 2014-05-27T21:54:27.677 に答える