模式匹配和命名参数合二为一

时间:2014-03-20 01:22:04

标签: haskell pattern-matching

在haskell中我可以使用模式匹配接收参数,这使我可以轻松访问基本元素,但将它们连接在一起会更复杂

let id (hd:tl) = (hd:tl)

我也可以通过名字接收它,但是将对象拆分为基本元素会更复杂。

let id list = ((head list):(tail list))

我可以在同一个函数中轻松访问整个对象及其组件吗?

我认为应该有像

这样的东西
let id (hd:tl) as list = ...

到现在为止我已经想通了

let id (hd:tl) =
   let list = (hd:tl)
   in ...

1 个答案:

答案 0 :(得分:11)

我认为您正在寻找@语法:

let id list@(hd:tl) = ...

你可以使用它变得非常复杂,就像在这个非常人为的例子中一样:

> :set +m        -- Multi-line expressions in GHCi
> let f :: [[Int]] -> [Int]
|     f whole@[fstLst@(x:xs), sndLst@(y:ys)] =
|         length whole :
|         length fstLst + x :
|         length sndLst + y :
|         xs ++ ys
|     f _ = []
> f [[1..10], [11..20]]
[2,11,21,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20]

由于它只是一个模式匹配构造,它显然适用于你拥有构造函数的任何类型。