Tôi đã chơi với một số phần mở rộng GHC để xác định một chức năng có thể làm như sau:Tiếp nhận như Chức năng Đối số với Constrained Existentials trong Haskell
let a = A :: A -- Show A
b = B :: B -- Show B
in
myFunc show a b -- This should return (String, String)
myFunc
nên đầy đủ đa hình trong chữ ký của show
, vì vậy có thể chấp nhận a
và b
với các loại khác nhau thỏa mãn Show
.
Đây là nỗ lực của tôi với các phần mở rộng 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)
Mục đích chính của tôi là để hiểu làm thế nào các phần mở rộng hoạt động; nhưng mắt của tôi, nó có vẻ như tôi đang nói GHC rằng có một hạn chế k
rằng một số a
và b
đáp ứng, và đó cũng là một chức năng (forall c. k c => c -> d)
có thể mất bất kỳ loại c
đáp ứng k
và trả về một cụ d
, bây giờ, dưới những điều kiện , tôi muốn áp dụng các chức năng để a
và b
để có được một tuple (d,d)
Sau đây là cách GHC phàn nàn:
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
tôi thiếu gì?
tôi giả sử bạn có nghĩa là đa hình trong những hạn chế đối số chức năng có thể có, bởi vì nếu không bạn chỉ có thể viết '(Hiển thị a, Hiển thị b) => (forall x. Hiển thị x => x -> Chuỗi) -> a -> b -> (String, String)'? Điều đó chỉ yêu cầu 'RankNTypes'. – Cubic
Đó là sự thật, tôi không muốn đề cập đến 'Hiển thị'. – enobayram