在阅读Typeclassopedia关于Monads的章节时,我看到了:
data Free f a = Var a
| Node (f (Free f a))
我输入:i Free
以获取相关信息。
ghci> :i Free
type role Free nominal nominal
data Free (f :: * -> *) a = Var a | Node (f (Free f a))
我见过kind
的{{1}}的类型:
* -> *
但是,我不确定如何使用ghci> :k []
[] :: * -> *
ghci> :k Maybe
Maybe :: * -> *
参数创建一个简单的Var
实例。
我该怎么做?
答案 0 :(得分:3)
您创建Var的方式仅为Var value
,例如Var "x"
。由于f
实际上并未出现在Var
的定义中,因此您选择的f
实际上并不会影响您创建Var的方式 - 只有在创建节点时才会这样做。
因此,在创建f
为[]
的节点时,您需要编写Node [Var "x"]
,而对于Maybe
,您需要编写Node (Some (Var "x"))
。如您所见,Var
的使用在两种情况下保持不变,您只需将不同的“集合”传递给Node
构造函数。