Haskell中(a-> Bool)和(a-> a-> Bool)之间的区别?

时间:2019-01-12 13:50:29

标签: haskell

我目前正在学习Haskell,并遇到了使我感到困惑的类型签名。

我知道:

(a -> Bool)

使用(Ord a)时是如何在类型签名中分配谓词,但是我遇到了一个声明为:

的类型签名。
(a -> a -> Bool)

根据我在网上发现的信息,这是不等式的类型签名,但是我对它们是否是要为谓词添加不等式感到困惑,即:

(> p x == True)

或者只是为了自己声明不平等。

谢谢。

1 个答案:

答案 0 :(得分:4)

当某个函数具有类型签名(a -> Bool)时,仅表示它采用某个不受约束的类型a的值并返回一个Bool,即True或{{1} }。但是,您可以限制类型变量False并获得类似a的信息,它限制多态类型Ord a => a -> Bool,即a必须具有类型类的实例a

您还可以部分应用功能。例如Ord,当您将(>) :: Ord a => a -> a -> Bool部分应用于>时,您得到5。这是一个新函数,它需要具有类型类(>5) :: (Ord a, Num a) => a -> Bool和类型类Ord的东西,并返回NumTrue

要回答您的问题,您当然可以通过将常量应用于另一个函数来创建一个新函数。如果您只想做False,那么您实际上也不需要==,请检查数字是否严格大于常数。

f = (>) 5
f 4 -- True
f 5 -- False 

我希望这可以帮助您开始使用Haskell。您可能应该阅读一些教程,以获得很好的概述。我可以推荐learn you a haskell