【发布时间】:2019-05-14 18:30:30
【问题描述】:
我有一个递归类型:data E a=A a (E a) (E a) | None
我的问题如下:
如果我想实现bind 运算符,我如何在给定操作函数的情况下对具体类型和递归类型进行操作?
instance Monad E where
return x= A x None None
(>>=) None _ = None
(>>=) (B t) f = f t
(>>=) (A x mx my) f = A {f x} (mx>>=f) (my>>=f) --here !!!
^
result is ma but slot requires concrete type
对于我来说,在A a (E a) (E a) 上为a 应用>>= 似乎我需要使用定制的function 来解开它。
我如何解决{f x}以便我解开f x 的结果以适合E 的具体插槽
我需要一个可以接受函数的方法:a-> ma 并将其传递给 (ma ->a)
unwrap::E a->a
unwrap None= what here ? ( i need a neutral element for any kind of a)
unwrap (A x _ _)=x
【问题讨论】:
-
那么您的
f x将在此处返回E a类型的内容,因此您只需实现一个“解包”数据构造函数并对其执行操作的函数。 -
你的意思是
instance Monad E where ...? -
那也应该是
None >>= _ = None,而不是_ >>= None = None。 -
如果忽略
B构造函数,这看起来像一个列表,因此您可能会通过查看Monad []实现获得一些启发。这个数据类型应该代表什么——各种构造函数A、B、None是什么意思? -
再次强调,如果您允许具有
None的空树,则不需要单独的叶构造函数:叶只是没有子树的A,A x None None。可能重复:Monad instance for binary tree.