- 论坛徽章:
- 0
|
Haskell 可以这样绑定,一举三得
- Prelude> let xss@(x:xs) = [1, 2, 3, 4]
- Prelude> xss
- [1,2,3,4]
- Prelude> x
- 1
- Prelude> xs
- [2,3,4]
复制代码
以前一直认为这种写法只是用在 pattern match 中呢 ?没想到直接绑定也可以
python 中有一种写法:- >>> point = x, y = 1, 2
- >>> point
- (1, 2)
- >>> x
- 1
- >>> y
- 2
复制代码 在 Haskell 中类似的一种写法:- Prelude> let point@(x, y) = (1, 2)
- Prelude> point
- (1,2)
- Prelude> x
- 1
- Prelude> y
- 2
复制代码 再推广一下:
除了常量、字符串外,任何其他 pattern matching 形式都可以被用到 Variables Binding 中
pattern 几种形式请参考帖子:>>>Haskell语法参考(点击此处)<<<中7. Patterns(模式)
- Prelude> let x = 1 --name
- Prelude> x
- 1
- Prelude> let _ = 1 -- _ 虽然这个语法正确,但不产生任何作用
- Prelude> let (x, y, z) = (1, 2, 3) -- (pat1, pat2 ... , patn)
- Prelude> x
- 1
- Prelude> y
- 2
- Prelude> z
- 3
- Prelude> let x:xs = [1, 2, 3] --pat1:pat2
- Prelude> x
- 1
- Prelude> xs
- [2,3]
- Prelude> let [_, x, y] = [1, 2, 3]
- Prelude> x
- 2
- Prelude> y
- 3
- Prelude> let 'a':'b':'c':x:xs = "abcdefg"
- Prelude> x
- 'd'
- Prelude> xs
- "efg"
- Prelude> let points@[point1, point2, point3] = [(1, 2), (3, 4), (4, 5)] --name@pat
- Prelude> points
- [(1,2),(3,4),(4,5)]
- Prelude> point1
- (1,2)
- Prelude> point2
- (3,4)
- Prelude> point3
- (4,5)
复制代码
[ 本帖最后由 izhier 于 2009-5-1 19:12 编辑 ] |
|