gpt4 book ai didi

haskell - 'uncurry' 是否有可能是一个 forall 量词?

转载 作者:行者123 更新时间:2023-12-05 00:17:49 26 4
gpt4 key购买 nike

假设我们有一个类型构造函数 f,它通过 DataKinds-promoted 对接受两种类型。

forall (f :: (ka, kb) -> *)

然后我可以实现一个函数 forward ,就像 curryforall量词:
forward :: forall (f :: (ka, kb) -> *).
(forall (ab :: (ka, kb)). f ab) ->
(forall (a :: ka) (b :: kb). f '(a, b))
forward x = x

但是,反向函数是有问题的:
backward :: forall (f :: (*, *) -> *).
(forall (a :: *) (b :: *). f '(a, b)) ->
(forall (ab :: (*, *)). f ab)
backward x = x

GHC 8.0.1 给出错误信息:

• 无法将类型“ab”与“(a0, b0)”匹配
‘ab’是一个刚性类型变量,由
类型签名:
向后::forall (ab::(*, *))。 (forall a b. f '(a, b)) -> f ab
时间:6:116
预期类型:fab
实际类型:f'(a0, b0)
• 在表达式中: x
在“向后”的等式中:向后 x = x

从概念上讲,它似乎是一个有效的程序。有没有另一种方法来实现这个功能?或者这是 GHC 的已知限制?

最佳答案

正如 Pigworker 和 Daniel Wagner 指出的那样,问题在于 ab可能是“卡住型”。您有时可以使用类型系列解决此问题(正如我在 one of pigworker's papers 中学到的):

type family Fst (x :: (k1, k2)) :: k1 where
Fst '(t1, t2) = t1

type family Snd (x :: (k1, k2)) :: k2 where
Snd '(t1, t2) = t2

backward :: forall (f :: (*, *) -> *) (ab :: (*, *)) proxy .
proxy ab ->
(forall (a :: *) (b :: *). f '(a, b)) ->
f '(Fst ab, Snd ab)
backward _ x = x

有时,另一种选择是使用包装器。
newtype Curry f x y = Curry (f '(x,y))

data Uncurry f xy where
Uncurry :: f x y -> f '(x, y)

关于haskell - 'uncurry' 是否有可能是一个 forall 量词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39355548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com