Поэтому я играл с определением типа данных 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? В конце концов, мы можем сопоставить несколько нульарных конструкторов с одним и тем же шаблоном.
- Есть ли прагма LANGUAGE, которую я могу дать GHC, чтобы он принял их?