实现`Monoidal Option`

时间:2014-12-01 13:43:50

标签: haskell

查看TypeclassopediaMonoidal的定义:

class Functor f => Monoidal f where
  unit :: f ()
  (**) :: f a -> f b -> f (a,b)

我们说我有以下Optional个实例:

data Option a = Some a 
                | None deriving Show

instance Functor Option where
   fmap _ None     = None
   fmap f (Some x) = Some (f x)

现在,我想实施Monoidal Option

instance Monoidal Option where
  unit = ???

但是,我不确定unit的实例类型是什么。

unit 每个 f ()的{​​{1}}类型是否为Monoidal

另外,f ()的含义是什么?我知道我错过了一些东西 - 我不清楚f ()是如何有用的类型。

2 个答案:

答案 0 :(得分:4)

f是一种类型构造函数,在这种情况下它是Option,因此f ()Option ()。此值有两种可能性 - NothingSome ()。鉴于unit应遵守的法律,即左右身份法,您应该返回Some ()

答案 1 :(得分:2)

我认为如果你考虑实例中涉及的实际类型会有所帮助。回想一下,实例中f定义中的classOption,所以:

instance Monoidal Option where
  -- unit :: Option ()
  unit = ???
  -- (**) :: Option a -> Option b -> Option (a,b)
  None   ** None   = ???
  Some a ** None   = ???
  None   ** Some b = ???
  Some a ** Some b = ???