查看Typeclassopedia对Monoidal
的定义:
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 ()
是如何有用的类型。
答案 0 :(得分:4)
f
是一种类型构造函数,在这种情况下它是Option
,因此f ()
是Option ()
。此值有两种可能性 - Nothing
或Some ()
。鉴于unit
应遵守的法律,即左右身份法,您应该返回Some ()
。
答案 1 :(得分:2)
我认为如果你考虑实例中涉及的实际类型会有所帮助。回想一下,实例中f
定义中的class
为Option
,所以:
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 = ???