s*******u 发帖数: 1855 | 1 http://learnyouahaskell.com/syntax-in-functions
ex1:
first :: (a, b, c) -> a
first (x, _, _) = x
second :: (a, b, c) -> b
second (_, y, _) = y
third :: (a, b, c) -> c
third (_, _, z) = z
从第一个例子看,_可以match一个single value.
ex2:
head' :: [a] -> a
head' [] = error "Can't call head on an empty list, dummy!"
head' (x:_) = x
从这个例子看,_可以match任意长度的value
到底是single,or任意长度呢?
ex3:
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
这里,assume这个_ match一位,而不是任意长度.任意长度被xs来match.为什么不是_
match任意长度,xs来match最后一个single value?
谢谢! | b********0 发帖数: 62 | 2 _可以match一切 与类型长度无关
这个match是构造这个变量的逆过程 应该是有唯一的结果的
【在 s*******u 的大作中提到】 : http://learnyouahaskell.com/syntax-in-functions : ex1: : first :: (a, b, c) -> a : first (x, _, _) = x : : second :: (a, b, c) -> b : second (_, y, _) = y : : third :: (a, b, c) -> c : third (_, _, z) = z
| s*******u 发帖数: 1855 | 3 谢谢!
那么为什么例子3:
ex3:
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
underscore是match第一个value,而不是前面所有的values(除了最后一个)?为什么xs来
match可变长度,而不是underscore? | l*******e 发帖数: 309 | 4
你可以看看这个
http://en.wikibooks.org/wiki/Haskell/Pattern_matching
Pattern match是deconstruct的过程,要一步一步来。冒号是constructor,先match,
然后_和xs再match。_不绑定,xs绑定到list的tail。
【在 s*******u 的大作中提到】 : 谢谢! : 那么为什么例子3: : ex3: : length' :: (Num b) => [a] -> b : length' [] = 0 : length' (_:xs) = 1 + length' xs : underscore是match第一个value,而不是前面所有的values(除了最后一个)?为什么xs来 : match可变长度,而不是underscore?
| b********0 发帖数: 62 | 5 比如说[1,2,3] 就是 1:2:3:[]
match _:xs 就是 1, :, 2:3:[]
如果你要match 1:2, :, 3:[]
你会发现1:2不是一个有效的类型
【在 s*******u 的大作中提到】 : 谢谢! : 那么为什么例子3: : ex3: : length' :: (Num b) => [a] -> b : length' [] = 0 : length' (_:xs) = 1 + length' xs : underscore是match第一个value,而不是前面所有的values(除了最后一个)?为什么xs来 : match可变长度,而不是underscore?
| l******t 发帖数: 55733 | 6 属实。1:2不存在
【在 b********0 的大作中提到】 : 比如说[1,2,3] 就是 1:2:3:[] : match _:xs 就是 1, :, 2:3:[] : 如果你要match 1:2, :, 3:[] : 你会发现1:2不是一个有效的类型
| a*****e 发帖数: 1700 | 7 写成 1 : ( 2 : ( 3 : [] ) ) 就容易理解了,因为 : 操作是 right associative。
Haskell 里面如果用符号做 data constructor 或者 function name,缺省是作为中缀
操作使用的。
【在 b********0 的大作中提到】 : 比如说[1,2,3] 就是 1:2:3:[] : match _:xs 就是 1, :, 2:3:[] : 如果你要match 1:2, :, 3:[] : 你会发现1:2不是一个有效的类型
| s*******u 发帖数: 1855 | 8 thanks for all helps. understand now. key point is :, not _ or xs. |
|