【发布时间】:2012-08-17 21:20:21
【问题描述】:
给定例如像
这样的类型data Tree a = Branch (Tree a) (Tree a)
| Leaf a
我可以轻松地为 Functor、Applicative、Monad 等编写实例。
但如果“包含”类型是预先确定的,例如
data StringTree = Branch StringTree StringTree
| Leaf String
我失去了编写这些实例的能力。
如果我要为我的 StringTree 类型编写函数
stringTreeReturn :: String -> StringTree
stringTreeBind :: String -> (String -> StringTree) -> StringTree
stringTreeFail :: String -> StringTree
-- etc.
满足单子定律,我还能说StringTree 是单子吗?
【问题讨论】:
-
fmap (const ())会导致什么结果? -
您甚至可以使用
stringTreeFMap :: (String -> String) -> (StringTree -> StringTree),但要真正成为范畴论意义上的单子,您需要join :: m (m a) -> m a,这根本不适合。 -
只是出于好奇,你为什么不能直接定义:
type StringTree = Tree String? -
@GabrielGonzalez:我可以;这是一个纯粹的理论问题。
-
您不能为
StringTree编写Monad实例,但我相信您仍然可以通过使用RebindableSyntax语言扩展来使用do糖。
标签: haskell monads functor category-theory