Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 实现`单项式选项`_Haskell - Fatal编程技术网

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