如何解决类型族中的冲突实例?

mb1*_*b14 6 haskell type-families

我正在尝试做一个'UnMaybe'类型系列,但它没有编译(实例族冲突).

这是我的代码

{-# LANGUAGE TypeFamilies #-}

type family UnMaybe a :: *

type instance UnMaybe (Maybe a) = a
type instance UnMaybe a = a
Run Code Online (Sandbox Code Playgroud)

错误信息

test.hs:4:16:
    Conflicting family instance declarations:
       type instance UnMaybe (Maybe a)
       -- Defined at test.hs:4:16
       type instance UnMaybe a
       -- Defined at test.hs:5:15
Run Code Online (Sandbox Code Playgroud)

我理解为什么它不起作用,无论如何还有另一种方法来实现相同的结果(或者激活它的扩展会允许它吗?)

kos*_*kus 11

如果你真的需要这个,你可以使用封闭式系列(至少需要GHC 7.8):

{-# LANGUAGE TypeFamilies #-}

type family UnMaybe a :: * where
  UnMaybe (Maybe a) = a
  UnMaybe a         = a
Run Code Online (Sandbox Code Playgroud)

现在:

GHCi> :kind! UnMaybe (Maybe Int)
UnMaybe (Maybe Int) :: *
= Int
GHCi> :kind! UnMaybe Bool
UnMaybe Bool :: *
= Bool
Run Code Online (Sandbox Code Playgroud)

  • 我现在明白封闭的家庭是什么 (2认同)