Haskell 实现`单项式选项`
查看的定义是Haskell 实现`单项式选项`,haskell,Haskell,查看的定义是Monoidal: class Functor f => Monoidal f where unit :: f () (**) :: f a -> f b -> f (a,b) 假设我有以下可选实例: data Option a = Some a | None deriving Show instance Functor Option where fmap _ None = None fmap f (
Monoidal
:
class Functor f => Monoidal f where
unit :: f ()
(**) :: f a -> f b -> f (a,b)
假设我有以下可选实例:
data Option a = Some a
| None deriving Show
instance Functor Option where
fmap _ None = None
fmap f (Some x) = Some (f x)
现在,我想实现Monoidal选项
:
instance Monoidal Option where
unit = ???
但是,我不确定单元的实例类型是什么
单元
是否为每个单项式
都有一种类型的f()
还有,f()
的含义是什么?我知道我遗漏了一些东西-我不清楚f()
是如何有用的类型。f
是一个类型构造函数,在这种情况下它是Option
所以f()
是Option()
。此值有两种可能-Nothing
或Some()
。给定单元
应该遵守的规则,即左标识和右标识规则,您应该返回Some()
f
是一个类型构造函数,在这种情况下它是选项
所以f()
是选项()
。此值有两种可能-Nothing
或Some()
。考虑到单元
应该遵守的规则,即左标识规则和右标识规则,您应该返回Some()
如果您考虑实例中涉及的实际类型,我认为这会有所帮助。回想一下,class
定义中的f
是实例中的选项,因此:
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 = ???
我认为如果您考虑实例中涉及的实际类型,这会有所帮助。回想一下,class
定义中的f
是实例中的选项,因此:
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 = ???
更好的说法是,对于每个幺半群f
,都有一个单元
,类型为f()
()
通常被称为unit——它是一种只有一个值的类型,也被写入()
。你可以把它看作是零元素的元组,就像(a,b)
是两个元素的元组类型f()
之所以有用,原因有很多。例如,putStrLn“你好,世界”::IO()
。每件事都有一些类型,但有时一个动作不会计算有用的值,让它返回()
是一个好迹象,表明它的副作用更有趣。或者,如果f
是一个函子,则具有f()类型的值
为任何a
类型的值提供了一种方法,您可以提供一个示例。例如,如果mkA::a
,那么fmap(const mkA)单位::(函子f,幺半群f)=>fa
。最好说,对于每个幺半群f
,都有一个单位
类型f()
()
通常被称为unit——它是一种只有一个值的类型,也被写入()
。你可以把它看作是零元素的元组,就像(a,b)
是两个元素的元组类型f()
之所以有用,原因有很多。例如,putStrLn“你好,世界”::IO()
。每件事都有一些类型,但有时一个动作不会计算有用的值,让它返回()
是一个好迹象,表明它的副作用更有趣。或者,如果f
是一个函子,则具有f()类型的值
为任何a
类型的值提供了一种方法,您可以提供一个示例。例如,如果mkA::a
,那么fmap(const mkA)单位::(函子f,幺半群f)=>fa
。