为什么我不能简化这种模式匹配?

has*_*lHQ 3 haskell

这很好用:

data Possibly a = LolNope | Yeppers a deriving (Eq, Show)

instance Functor Possibly where
    fmap f (Yeppers a) = Yeppers (f a)
    fmap _ LolNope = LolNope
Run Code Online (Sandbox Code Playgroud)

LolNope在最后一行重复看起来并不优雅.用以下内容替换最后一行不起作用:

fmap _ z = z  -- error: Couldn't match type ‘a’ with ‘b’ ...
Run Code Online (Sandbox Code Playgroud)

这也不起作用:

fmap _ z@(_) = z  -- error: Couldn't match type ‘a’ with ‘b’ ...
Run Code Online (Sandbox Code Playgroud)

他们为什么不工作,有没有其他选择?

chi*_*chi 7

因为它们涉及不同类型:

fmap f LolNope = LolNope
--               ^-- Possibly b
--     ^-- Possibly a
--   ^-- a -> b
Run Code Online (Sandbox Code Playgroud)

当然,这两个LolNopes 的运行时表示在GHC中是相同的,但这还不够.它的表现甚至可以与重合Nothing,(),[],和其他无参构造函数却没有那些被允许.

恕我直言,这是关于类型系统比实际需要更严格的一个很好的例子.

尽管静态约束,则该GHC运行时可能会选择重新使用相同的内存位置LolNope :: Possibly aLolNope :: Possibly b.(我不记得它是否确实......)

  • 我相信他们会共享内存位置,是的.对于"要么",情况并不是那么好.转换`右边p ::要么xa`要么输入`要么ya`可能需要分配一个新的`Right`构造函数(GHC试图在C--中清除它,我想,但它并不完美).一些GHC大师正在谈论试图找到一段时间的修复,但我认为他们没有做过 - 这对于System FC来说非常不合适. (2认同)