gpt4 book ai didi

haskell - 无法破坏传递类型

转载 作者:行者123 更新时间:2023-12-02 07:53:12 25 4
gpt4 key购买 nike

假设我有以下 GADT:

data Stage a b where
Comb :: Stage a b -> Stage b c -> Stage a c
FMap :: (a -> b) -> Stage a b

我现在想要一个像这样工作的函数:

run (a `Comb` b) = (a,b)
run (FMap f) = (FMap f,FMap id)

我如何构造这样的函数?

我尝试了不同的绑定(bind)类型的方法,但没有成功。我是否缺少一个扩展来支持更广泛的类型绑定(bind)?

这是错误消息:

Couldn't match type `t' with `(Stage t1 b, Stage b t2)'
`t' is a rigid type variable bound by
the inferred type of run :: Stage t1 t2 -> t at <interactive>:11:5
In the expression: (a, b)
In an equation for `run': run (a Comb b) = (a, b)

我想要完成的任务的描述:我想设计一个 DSL 和一个函数 run,它可以尝试以几种不同的方式运行 DSL 的某些代码(每种方式都有多个不同的运行函数)。run 函数将尝试运行尽可能多的给定的代码,然后报告哪些代码无法运行以及可以运行的代码的结果是什么。

最佳答案

您需要一个运行的类型签名,因为您要在 GADT 上进行模式匹配。 GADT 上的模式匹配需要类型细化,并且通常仅在存在类型签名的情况下才有效。

但尚不清楚类型签名是什么。如果输入值为

a `Comb` b :: Stage x y

然后返回(a, b),其中

a :: Stage x b
b :: Stage b y

对于一些未知的b。这是一种存在主义类型的逃避。你不能写

run :: Stage x y -> (State x b, Stage b y)

因为这意味着它必须适用于所有 b,但它仅适用于某些(未知)b .

不幸的是,目前还不清楚为什么要编写像 run 这样的函数。为什么要生产一对?以后你想用这一对做什么? Comb 构造函数被定义为组合具有未知中间类型的两个阶段,因此此版本的 run 可以工作:

run :: Stage a b -> Stage a b
run (a `Comb` b) = a `Comb` b
run (FMap f) = FMap f `Comb` FMap id

或者您可以定义一个更具体的数据类型,仅允许具有未知中间类型的两个阶段的“对”:

data PairStages a b where
PairStages :: Stage a b -> Stage b c -> PairStages a c

然后:

run :: Stage a b -> PairStages a b
run (a `Comb` b) = PairStages a b
run (FMap f) = PairStages (FMap f) (FMap id)

但我仍然觉得 run 返回一对很奇怪。正如我所说,目前还不清楚您想如何处理 run 的结果。让 run 成为一个递归函数似乎更有用,它实际上以某种方式组合了 Comb 情况下运行组件的结果。例如,像这样:

run :: Stage a b -> (a -> b)
run (a `Comb` b) = run b . run a
run (FMap f) = f

关于haskell - 无法破坏传递类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15255850/

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