我是Haskell的新手,一般来说,是函数式编程,我对它的语法有点不舒服.
在下面的代码中=>表示什么?还(Num a, Ord a)呢?
loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t
Run Code Online (Sandbox Code Playgroud)
ehi*_*ird 36
这是一个类型类约束; (Num a, Ord a) => ...表示loop适用于a作为Num和Ord类型类的实例的任何类型,分别对应于数字类型和有序类型.基本上,你能想到的loop具有上的右手侧类型=>,除了a要求是实例Num和Ord.
你可以把类型类为基本类似于OOP接口(但他们不是一回事!) -它们封装了一套任何情况下都必须支持定义和通用代码可以使用这些定义来编写.例如,Num包括加法和乘法等数值运算,Ord包括小于,大于等等.
有关类型类的更多信息,请参阅此介绍从了解你一个Haskell.
Owe*_*wen 16
=> 分离类型签名的两个部分:
所以你可以认为(Num a, Ord a) => a -> (t -> t) -> t -> t"类型是a -> (t -> t) -> t -> t,并且必须有一个Num实例a和一个Ord实例a".
有关类型类的更多信息,请参阅http://www.learnyouahaskell.com/types-and-typeclasses
考虑它的一种方法是,Ord a并且Num a是该功能的附加输入.它们是一种特殊的输入:字典.当您使用此功能与特定类型的a,还必须有字典可用于Ord与Num该类型的操作a为好.
任何使用带字典输入的函数的函数也必须具有相同的字典输入.
foo :: (Num a, Ord a) => a -> t
foo x = loop x someFunc someT
Run Code Online (Sandbox Code Playgroud)
但是,您不必显式传递这些字典.假设有一本字典,Haskell会为你处理这个问题.您可以使用类型类实例创建字典.
instance Num MyType with
x + y = ...
x - y = ...
...
Run Code Online (Sandbox Code Playgroud)
这会为Num操作创建一个字典MyType,因此MyType可以在任何Num a需要输入的地方使用(假设它满足其他要求,当然).