Делая шаблоны верхнего уровня мономорфными

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.

1 ответ

Решение

Попробуй это:

(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)
Другие вопросы по тегам