gpt4 book ai didi

haskell - 为什么在 Haskell 函数应用中使用逗号会导致不同的类型?

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

我在 ghci 中运行了这些 haskell 函数,然后得到了这些输出,但我不知道如何解释它。 g(x,y) 和 g(x y) 之间有什么区别以及如何产生输出。

*Main> let  j g (x, y) = g(x,y)
*Main> :t j
j :: ((a, b) -> t) -> (a, b) -> t

*Main> let j g (x, y) = g(x y)
*Main> :t j
j :: (t1 -> t2) -> (t3 -> t1, t3) -> t2

最佳答案

What is the difference between g(x,y) and g(x y) and how the yield that output.

与所有编程语言相比,Haskell 拥有一种“不寻常”的语法(与 C、Java 等非常常见的语言相比)来描述函数应用程序。

f x是一个函数应用程序 f函数,和 x参数。括号不是必需的(与 C、Java、C# 等编程语言相反),但可以包含它们。因此f(x)被解释为f (x)(x)以来就是x ,两者是等价的。

考虑到这一点,如果我们看 g (x y)我们看到两个函数应用程序:x y ,和g (x y) 。在像 Java 这样的编程语言中,这看起来像 g(x(y))g ,和x因此,这两个函数都是(其中 x 的“输出类型”应该与 g 的“输入类型”相同)。用x进行功能应用该功能和 y参数,结果是 g 函数应用程序中的参数函数。

Haskell 也有元组。例如(4, 2) 2 元组。 (x, y)也是一个2元组:x是第一个元素,并且 y第二。如果我们这样写g (x, y) ,然后我们用 g 执行函数应用函数,和 (x, y) (2元组)参数。这意味着 x类型为a ,和y类型为b ,然后g类型为(a, b) -> c .

考虑到这一点,我们可以导出函数的签名,例如:

j g (x, y) = g (x,y)

我们在这里看到j有“两个”参数(在 Haskell 中,所有函数都有一个参数,该函数的结果采用另一个参数),因此我们首先将函数的签名描述为:

j :: a -> b -> c
g :: a
(x, y) :: b
g (x, y) :: c

(x, y)是一个元组,我们专门研究 (x, y) 的类型如(d, e) ,这意味着签名更改为:

j :: a -> (d, e) -> c
g :: a
(x, y) :: b ~ (d, e)
g (x, y) :: c
x :: d
y :: e

(波形符 ~ 代表两种类型相同)

自从我们调用 g(x, y)作为参数,我们知道g是一个函数。输入类型为参数(x, y)的类型,所以(d, e) ,而其结果类型在这里是 j g (x, y) 结果的类型,因此c ,所以我们得出g类型为(d, e) -> c ,所以这意味着:

j :: ((d, e) -> c) -> (d, e) -> c
g :: a ~ ((d, e) -> c)
(x, y) :: b ~ (d, e)
g (x, y) :: c
x :: d
y :: e

然后满足所有约束,因此类型为 j是:

j :: ((d, e) -> c) -> (d, e) -> c

我离开派生 j g (x, y) = g(x y) 的类型作为练习。

关于haskell - 为什么在 Haskell 函数应用中使用逗号会导致不同的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52358403/

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