Итак, я играл с определением типа данных TrieSet (хотя я знаю , мне не нужно ):
module Temp where
import Data.Map
data TrieSet a = Nonterminal (Data.Map a (TrieSet a)) | Terminal (Data.Map a (TrieSet a))
insert :: Ord a => [a] -> TrieSet a -> TrieSet a
insert [] (_ m) = Terminal m
insert (a:as) (c m) = c $ insertWith (insert as . flip const) a (insert as $ Nonterminal empty) m
Когда я получаю ошибку, я никогдавидел раньше:
% ghc -c Temp.hs
Temp.hs:8:11: Parse error in pattern
Так что казалось, что GHC не любит сопоставлять несколько унарных конструкторов с одинаковым шаблоном.Я сделал еще один тест, чтобы убедиться, что это была проблема:
module Temp2 where
extract :: Either String String -> String
extract (_ s) = s
, которая, казалось, подтвердила мое подозрение:
% ghc -c Temp2.hs
Temp2.hs:4:9: Parse error in pattern
Поэтому мой вопрос (из нескольких частей):
- Прав ли я, почему GHC не нравятся эти функции?
- Есть ли причины, по которым это не будет частью стандарта Haskell?В конце концов, мы можем сопоставить несколько нулевых конструкторов с одним и тем же шаблоном.
- Существует ли прагма ЯЗЫКА, которую я могу дать GHC, чтобы она принимала их?