Haskell 中的模式绑定
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 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
找到了,这个形式应该叫模式绑定
在 >>>Haskell语法参考(点击此处)<<< 中的2. Pattern bindings(模式绑定)
竟然把它给忘了
这个倒是没在书上看到过
书上说是 Let Bindings
如果在代码中,应该是 Bindings
应该是其中用到了 pattern,没有 matching(比较) 的含义吧
pattern matching (比较) 用在函数中来选择某一分支吧 ?
[ 本帖最后由 izhier 于 2009-4-28 22:02 编辑 ]
嗯,应该叫 Variables Bindings
我改过来
纠正一下,Haskell 中并没有“赋值”,
你所说的【以前一直认为这种写法只是用在 pattern match 中呢】真是对极了,
let xss@(x:xs) = [1, 2, 3, 4] 正就是模式匹配。
一个经典的用法是 scanr 函数的定义:
复制代码