在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 ...
答案 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]
由于它只是一个模式匹配构造,它显然适用于你拥有构造函数的任何类型。