Я играл с некоторыми расширениями GHC, чтобы определить функцию, которая может делать следующее:
let a = A :: A -- Show A
b = B :: B -- Show B
in
myFunc show a b -- This should return (String, String)
myFunc
должен быть полностью полиморфным в сигнатуре show
, чтобы он мог принимать a
и b
с разными типами, удовлетворяющими Show
.
Вот моя попытка с расширениями GHC RankNTypes
, ConstraintKinds
, KindSignatures
:
myFunc :: forall (k :: * -> Constraint) a b d. (k a, k b)
=> (forall c. k c => c -> d) -> a -> b -> (d, d)
Моя главная цель — понять, как работают эти расширения; но на мой взгляд, кажется, что я говорю GHC, что есть ограничение k
, которому удовлетворяют некоторые a
и b
, а также есть функция (forall c. k c => c -> d)
, которая может принимать любой тип c
, удовлетворяющий k
, и возвращать конкретное d
, теперь, при этих условиях , я хочу применить функцию к a
и b
, чтобы получить кортеж (d,d)
Вот как GHC жалуется:
Could not deduce (k0 a, k0 b)
from the context (k a, k b)
bound by the type signature for
myFunc :: (k a, k b) =>
(forall c. k c => c -> d) -> a -> b -> (d, d)
at app/Main.hs:(15,11)-(16,56)
In the ambiguity check for the type signature for ‘myFunc’:
myFunc :: forall (k :: * -> Constraint) a b d.
(k a, k b) =>
(forall c. k c => c -> d) -> a -> b -> (d, d)
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the type signature for ‘myFunc’:
myFunc :: forall (k :: * -> Constraint) a b d. (k a, k b) =>
(forall c. k c => c -> d) -> a -> b -> (d, d)
...
Could not deduce (k c)
from the context (k a, k b)
bound by the type signature for
myFunc :: (k a, k b) =>
(forall c. k c => c -> d) -> a -> b -> (d, d)
at app/Main.hs:(15,11)-(16,56)
or from (k0 c)
bound by the type signature for myFunc :: k0 c => c -> d
at app/Main.hs:(15,11)-(16,56)
In the ambiguity check for the type signature for ‘myFunc’:
myFunc :: forall (k :: * -> Constraint) a b d.
(k a, k b) =>
(forall c. k c => c -> d) -> a -> b -> (d, d)
To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
In the type signature for ‘myFunc’:
myFunc :: forall (k :: * -> Constraint) a b d. (k a, k b) =>
(forall c. k c => c -> d) -> a -> b -> (d, d)
app/Main.hs15:40
Что мне не хватает?
(Show a, Show b) => (forall x. Show x => x -> String) -> a -> b -> (String,String)
? Для этого требуется толькоRankNTypes
. - person Cubic   schedule 22.09.2016Show
. - person enobayram   schedule 22.09.2016