假设一个模式:
pattern P :: [Int]
pattern P <- a:_
我可以以某种方式在函数f
中使用a
吗?
f :: [Int] -> Int
f P = a
上面的代码产生Not in scope: 'a'
的错误。
最佳答案
好吧,这有点尴尬,但我发现这样做很有效:
{-# LANGUAGE PatternSynonyms #-}
pattern P :: Int -> [Int]
pattern P a <- a:_
f :: [Int] -> Int
f (P b) = b
main = print $ f [42]
这里的关键点是模式参数变得显式,但随后它也作为将被匹配的 b
模式1 传递。我错过了这一难题。
缺点是显然你需要枚举你想使用的模式的所有部分。
1当然这个还是可以叫a
的,我只是换个名字来说明一下。
关于haskell - 我可以从模式同义词中捕获值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53520272/