Допустим, у меня есть следующий тип данных:Tricky тип подписи для пар обращенных пар
data D a b = D (a,b) (b,a)
И я хочу, чтобы определить следующую функцию на нем:
apply f (D x y) = D (f x) (f y)
Что тип подписи от apply
?
Вот некоторые примеры f
которые хорошо:
f :: a -> a -- OK
f :: (a, b) -> (b, a) -- OK
f :: (a, b) -> ((a, c), (b, c)) -- OK
Во всех вышеперечисленных случаях, мы в конечном итоге с действительным типом Д.
Но это не в порядке:
f :: (a, b) -> (a, a)
Потому что, когда мы отправляем такую функцию через apply
, нам приходится пытаться построить D (a,a) (b,b)
, который недействителен, если a = b
.
Возможно, я не могу найти подпись типа, чтобы выразить все это? Кроме того, в целом, есть ли способ заставить GHC рассказать мне, что должны делать эти подписи?
типизированные Отверстия Edit:
В попытке найти тип с помощью типизированных отверстий, я попытался следующие:
x = apply _ (D (1::Int,'a') ('b',2::Int))
И получил:
Found hole ‘_’ with type: (Int, Int) -> (b, b)
Where: ‘b’ is a rigid type variable bound by
the inferred type of x :: D b b
который, кажется, я не понимаю, как f :: (Int, Int) -> (b, b)
явно не будет работать здесь.
«есть способ, чтобы получить GHC сказать мне какими должны быть эти подписи? " - Вы просмотрели [напечатанные отверстия] (https://wiki.haskell.org/GHC/Typed_holes)? – bheklilr
Я только что сделал, и получил то, что кажется глупостью назад, как подробно описано в редактировании. – Clinton
В соответствии с 'ghci',' apply :: ((t, t) -> (b, b)) -> D t t -> D b b'. – Dogbert