Jak*_*ruk 6 haskell pattern-matching
在haskell中,我可以使用模式匹配接收参数,这使我可以轻松访问基本元素,但将它们连接在一起会更复杂
let id (hd:tl) = (hd:tl)
Run Code Online (Sandbox Code Playgroud)
我也可以通过名字接收它,但是将对象拆分为基本元素会更复杂.
let id list = ((head list):(tail list))
Run Code Online (Sandbox Code Playgroud)
我可以在同一个函数中轻松访问整个对象及其组件吗?
我认为应该有类似的东西
let id (hd:tl) as list = ...
Run Code Online (Sandbox Code Playgroud)
到现在为止我已经想通了
let id (hd:tl) =
let list = (hd:tl)
in ...
Run Code Online (Sandbox Code Playgroud)
bhe*_*ilr 12
我想你正在寻找@语法:
let id list@(hd:tl) = ...
Run Code Online (Sandbox Code Playgroud)
你甚至可以使用它变得非常复杂,就像在这个非常人为的例子中一样:
> :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]
Run Code Online (Sandbox Code Playgroud)
因为它只是一个模式匹配构造,所以它显然适用于你拥有构造函数的任何类型.