所以我正在尝试定义 TrieSet 数据类型(尽管我知道我不需要 http://hackage.haskell.org/package/TrieMap):
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 一个 LANGUAGE pragma 让它接受这些吗?
- 是的。从来不支持这种通配符。
- 在我看来,如果您不知道匹配的数据构造函数,则推断函数的类型会困难得多。只考虑一个函数
f (_ n) = n
。它的类型应该是什么? Haskell 的类型系统无法描述类型构造函数的数量,因此像这样的函数f
不可能存在。
- 我不这么认为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)