gpt4 book ai didi

Haskell 名称声明规则

转载 作者:行者123 更新时间:2023-12-01 09:18:56 28 4
gpt4 key购买 nike

我正在自学 Haskell,我遇到了两个“翻转”函数的实现,这对我提出了有关名称声明的问题。

这两个做同样的事情:

flip'' :: (a -> b -> c) -> b -> a -> c  
flip'' f y x = f x y

flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
where g x y = f y x

第一个例子如我所料。在第二个示例中,我很困惑为什么在我们尚未声明 x 或 y 时允许我们编写 g x y = f y x。我知道惰性求值意味着在需要它们之前都不会求值,但我希望编译器至少需要一个声明。

即使没有类型签名也能编译...这很好用:

flip' f = g  
where g x y = f y x

那么 x 和 y 只是完全无类型的变量吗?还是发生了其他事情?为什么我们能够做到这一点?

最佳答案

I'm confused why we're allowed to write g x y = f y x when we haven't declared either x or y yet.

由于 g、x 和 y 出现在等号的左侧,因此实际上已声明了它们。 where 引入了它所附加代码的本地范围。代码可以这样写:

flip f = let g x y = f y x in g

英语:设 g 是一个函数,有两个参数 x 和 y ...。

关于Haskell 名称声明规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585676/

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