繁体   English   中英

Haskell类型签名

[英]Haskell Type Signatures

我是haskell的新手,我读了一些关于这个称为类型签名的东西,但有一些我不理解的东西。

这是我正在看的代码:

--mult applies product
mult :: Num a => [a] -> a
mult  = foldr (*) 1 

--posList filters positive numbers out
posList :: (Ord a, Num a) => [a] -> [a]
posList = filter (>0) 

--trueList determines whether all of the members of a list are T or not
trueList :: [Bool] -> Bool
trueList  =  foldr(&&) True 

--evenList determines where all of the members of a list are even or not
evenList :: (Integral a, Foldable t) => t a -> Bool
evenList x = if (((foldr (+) 2 x ) `mod` 2) == 0) then True else False

所以,我知道你可以用不同的方式更容易地完成这些功能,但我有使用更高阶函数mapfilterfoldr赋值,所以我必须这样做。 无论如何,我理解这些功能是如何工作的,因为我是编写它们的人,我不理解的是那些术语IntegralFoldable ,它们是什么意思? 他们用Haskell称之为什么?

这些是多态类型的约束

Haskell尽管是静态类型的,但通过称为参数多态的系统,可以很容易地编写可以使用不同类型的函数。 我将首先为您的所有函数提供具体(单态)签名:

mult :: [Integer] -> Integer
mult  = foldl' (*) 1  -- foldl' is better for performance/memory than foldr

posList :: [Integer] -> [Integer]
posList = filter (>0) 

trueList :: [Bool] -> Bool
trueList  =  foldl' (&&) True

evenList :: [Integer] -> Bool
evenList x = foldl' (+) 2 x `mod` 2 == 0
            -- `if True then True else False` is tautological

所有这些签名都有效(包括改进的实现和原始的签名)。

但它们适用于Integer列表。 这并不总是足够笼统; 例如,计算分数列表的乘积是完全合理的。 但是对于单态签名, mult [1.5, 2.4, 20]不起作用:这些数字与Integer不兼容。 您不希望将函数限制为整数,只是希望它可以使用任何数字类型,并始终获得与元素相同类型的结果。 即,你基本上想要签名

mult :: ∀ a . [a] -> a

...要读取“对于所有类型a ,函数mult采用其元素具有类型a的列表,并给出单个a值作为结果。当你有这样的类型变量时, 隐含在Haskell中,即你也可以做到

mult :: [a] -> a

但这不起作用,因为该函数必须能够乘以元素。 但这对所有类型不可能,仅适用于数字类型 因此,您添加约束

mult :: Num a => [a] -> a

对于posList来说,它是完全相同的:签名本质上是

posList :: [a] -> [a]

但是你还需要能够将元素与0Num )进行比较( Ord )。 因此约束

posList :: (Num a, Ord a) => [a] -> [a]

evenList情况下,数值运算是(+)(==)mod 因此原则上我们需要NumEqIntegral ,但Integral无论如何都有NumEq作为超类 ,所以仅此就足够了:

evenList :: Integral a => [a] -> Bool

......但是,这还不是最常见的形式。 您可以使用折叠来减少该列表,但列表不是唯一可以折叠的内容,例如您还可以折叠数组,贴图和Maybe值。 可以折叠的所有容器的类型类都被调用,你不会猜它, Foldable 所以我们最终得到了

evenList :: (Integral a, Foldable t) => t a -> Bool

您可以对multtrueList应用相同的泛化:

mult :: (Num a, Foldable t) => t a -> a
trueList :: Foldable t => t Bool -> Bool

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM