我在教自己的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只是完全无类型变量?或者还在发生其他事情?为什么我们能够做到这一点?
x和y是_多态类型变量。它们没有以任何特殊方式使用,所以它们的类型可以是任何东西。 – AndrewC
@AndrewC谢谢 - 这是一个有用的思考方式,也是我进一步研究的关键词:) – Stephen