gpt4 book ai didi

Haskell Lambda 函数——两个看似等效的函数,一个有效,另一个错误

转载 作者:行者123 更新时间:2023-12-04 13:04:27 26 4
gpt4 key购买 nike

此 Lambda 函数返回 1:

  (\x y -> 1) 1 p

其中 p = (\x y -> 1)

好的,这对我来说很有意义—— Lambda 函数返回 1,与它的参数无关。

现在,这个 Lambda 函数会生成一个错误(无限类型错误):
  (\x y -> x y x) p 1

这对我来说没有意义。如果将该函数应用于参数,则将 p 替换为 x 并将 1 替换为 y 的结果:
  p 1 p

用它的定义替换第一个 p:
  (\x y -> 1) 1 p

嘿!这与上面的相同,返回 1。

问题:为什么 (\x y -> 1) 1 p 成功而 (\x y -> x y x) p 1 失败?

/罗杰

最佳答案

采用这个表达式(其中两个 p 必须具有相同的类型,因为如果您没有明确指定多态类型,则 lambda 变量不能同时具有两种类型):

p 1 p
p的类型是什么在这种情况下?假设 1Int为简单起见。让我们从一个简单的尝试开始:
(p :: Int -> ? -> Int) 1 p

那么,问号是什么?嗯,它必须是 p 的类型因为那是你给出的论点。所以:
(p :: Int -> (Int -> ? -> Int) -> Int) 1 p

同样,同样的问题,同样的解决方案:
(p :: Int -> (Int -> (Int -> ? -> Int) -> Int) -> Int) 1 p

现在你明白为什么我们有无限类型的问题了:虽然我们不需要知道 p 的第二个参数的类型。 ;因为 Haskell 类型系统是严格的(又名不是惰性的),它无论如何都需要找出类型,并被这种无限类型卡住。

此代码成功:
(\x y -> 1) 1 p

... 因为左边的函数可以有与 p 不同的类型,因为它们是不同的功能,所以我们在尝试统一类型时不会遇到同样的问题:
((\ x y -> 1) :: a -> b -> Int) 1 (p :: c -> d -> Int)

关于Haskell Lambda 函数——两个看似等效的函数,一个有效,另一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9558298/

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