我正在自学 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
第一个例子正如我所料。在第二个例子中,我很困惑为什么我们g x y = f y x
还没有声明 x 或 y 时允许我们写。我知道惰性评估意味着在需要它们之前都不对其进行评估,但我希望编译器至少需要一个声明。
即使没有类型签名它也可以编译......这很好用:
flip' f = g
where g x y = f y x
那么 x 和 y 只是完全无类型的变量吗?还是发生了其他事情?为什么我们能够做到这一点?