gpt4 book ai didi

haskell - 确定 Haskell 函数的类型

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

过去的一个考试问题是用定义ring r q p = r (q p)来陈述函数ring的类型。据说答案是 ring::(b -> c) -> (a -> b) -> (a -> c),但我不知道这是从哪里来的。当然,这样的类型表明 ring 仅接收两个参数,但在定义中它需要三个参数,那么这是怎么回事?

最佳答案

Haskell 中的每个函数都采用一个 参数。然而,函数可以返回带有另一个参数的函数。然而 Haskell 引入了一些语法以使其更加方便。因此,签名 (b -> c) -> (a -> b) -> (a -> c) 等价于 (b -> c) -> ((a -> b) -> (a -> c))(b -> c) -> (a -> b) -> a -> c

我们先分析一下表达式:

ring r q p = r (q p)

由于目前我们对类型还不太了解,所以我们首先为参数分配一些类型:

r :: a
q :: b
p :: c
ring :: a -> b -> c -> d

现在我们可以开始确定类型了。在表达式中,我们看到q p,这意味着q是一个函数,而p是一个参数。因此,这意味着 qc -> e 类型的函数(其中 e 是我们引入的类型参数)。

所以我们得出:

q :: c -> e
p :: c
q p :: e

接下来我们看到 q p 的结果被用作 r 函数的参数,这意味着 r 是一个函数采用 e 作为参数类型。因此,我们将 r 的类型设置为 e -> f。由此我们知道:

q p :: e
r :: e -> f
r (q p) :: f

由于ring r q p的结果是r (q p),因此这意味着ring的类型是:

ring :: (e -> f) -> (c -> e) -> c -> f

或更详细:

ring :: (e -> f) -> ((c -> e) -> (c -> f))

关于haskell - 确定 Haskell 函数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57485198/

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