当需要显示地指定表达式类型时,可以使用type annotaion
,即在表达式后面加上::
和需要指定的类型。举例如下:
> :type 1 :: Int
1 :: Int :: Int
可以看到1
被强制指定为Int
类型。Type annotation
也可以用来获得Int
等类型的边界值:
> minBound :: Int
-9223372036854775808
> maxBound :: Int
9223372036854775807
当需要显示地指定表达式类型时,可以使用type annotaion
,即在表达式后面加上::
和需要指定的类型。举例如下:
> :type 1 :: Int
1 :: Int :: Int
可以看到1
被强制指定为Int
类型。Type annotation
也可以用来获得Int
等类型的边界值:
> minBound :: Int
-9223372036854775808
> maxBound :: Int
9223372036854775807
在数学中,comprehension
可以表示为从一个集合生成另一个集合:
{x² | x ∈ {1...5}}
在Haskell
中,list comprehension
可以表示从一个list
生成另外一个list
:
> [x^2 | x <- [1 .. 10], even x]
[4,16,36,64,100]
list comprehension
可以包含两部分:x <- [1 .. 10]
是generator
,表明x
的值从哪里获得;even x
是guard
,相当于限制哪些x
的值可以用于生成新的list
。Generator
和guard
都可以有多个,用,
分开:
> [x * y | x <- [1 .. 10], y <- [1 .. 10], even x, odd y]
[2,6,10,14,18,4,12,20,28,36,6,18,30,42,54,8,24,40,56,72,10,30,50,70,90]
需要注意的是,改变generator
的顺序会改变最后生成list
的顺序。多个generator
像嵌套循环,位置靠后的是里层循环,位置靠前的是外层循环。举例如下:
> [(x, y) | x <- [1, 2, 3], y <- [4, 5]]
[(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)]
> [(x, y) | y <- [4, 5], x <- [1, 2, 3]]
[(1,4),(2,4),(3,4),(1,5),(2,5),(3,5)]
参考资料:
List Comprehensions。