我可以从模式同义词中捕获值吗?

时间:2018-11-28 13:11:16

标签: haskell pattern-matching pattern-synonyms

假设模式:

pattern P :: [Int]
pattern P <- a:_

我可以以某种方式在功能a中使用f吗?

f :: [Int] -> Int
f P = a

上面的代码生成Not in scope: 'a'错误。

2 个答案:

答案 0 :(得分:6)

好的,这有点令人尴尬,但是我发现只是这样做是有效的:

{-# LANGUAGE PatternSynonyms #-}

pattern P :: Int -> [Int]
pattern P a <- a:_

f :: [Int] -> Int
f (P b) = b

main = print $ f [42]

这里的关键是pattern参数变得显式,但是它也作为b pattern 1 被传递。我错过了这一难题。

缺点是显然您需要枚举要使用的模式的所有部分。


1 当然,它仍然可以称为a,我只是为了说明起了不同的名字。

答案 1 :(得分:3)

您想要这样的东西吗?

{-# LANGUAGE PatternSynonyms, RecordWildCards #-}
module Temp where

pattern Cons :: a -> [a] -> [a]
pattern Cons { car, cdr } <- car:cdr

safeHead :: [a] -> Maybe a
safeHead Cons{..} = Just car
safeHead _ = Nothing

这曾经引起错误,但should work with recent releases of GHC

请记住,carcdr被全局定义为函数,并通过RecordWildCards在本地被阴影化:

ghci> :browse Temp
pattern Cons :: a -> [a] -> [a]
car :: [a] -> a
cdr :: [a] -> [a]
safeHead :: [a] -> Maybe a