3

假设一个模式:

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

我可以在函数中使用吗?af

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

上面的代码会产生一个错误Not in scope: 'a'

4

2 回答 2

6

好的,这有点尴尬,但我发现这样做很有效:

{-# 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,我只是为了说明而将其命名为不同的名称。

于 2018-11-28T13:53:42.837 回答
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

这曾经导致错误,但应该适用于最新版本的 GHC

请记住carcdr被全局定义为函数并通过以下方式在本地隐藏RecordWildCards

ghci> :browse Temp
pattern Cons :: a -> [a] -> [a]
car :: [a] -> a
cdr :: [a] -> [a]
safeHead :: [a] -> Maybe a
于 2018-11-28T18:15:27.980 回答