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



假设一个模式:

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,我只是为了说明而用不同的名字命名。

你想要这样的东西吗?

{-# 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

这曾经导致错误,但应该与最近发布的GHC一起使用。

请记住,carcdr被全局定义为函数,并通过RecordWildCards:进行局部阴影处理

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

相关内容

  • 没有找到相关文章

最新更新