【发布时间】:2015-04-12 09:53:51
【问题描述】:
我的范畴论知识不是很好。所以请多多包涵。
我一直在阅读Monads Made Difficult
看到了下面的定义。
class (Category c, Category d) => Functor c d t where
fmap :: c a b -> d (t a) (t b)
从那个网站我读到 Haskell 前奏曲中的 Functor 类型实际上是 Endofunctor。 (其中上述类中的c类和d类都是Hask)
阅读完页面后,我想知道。如果 Haskell 使用真正的 Functor 而不仅仅是 Endofunctor,它会更适合元编程吗?
假设我们有以下内容(Js 代表 Javascript)
data Js a where
litInt :: Integer -> Js Integer
litString :: String -> Js String
var :: String -> Js a
lam :: String -> Js b -> Js (a -> b)
let :: String -> Js a -> Js b -> Js b
ap :: JsFunc a b -> Js a -> Js b
type JsFunc a b = Js (a -> b)
现在回到上面 Functor 的定义
class (Category c, Category d) => Functor c d t where
fmap :: c a b -> d (t a) (t b)
我们可以让 c 是 JsFunc,d 是 Hask 而不是 Js
这将为我们提供一个适用于 Js 的 Functor。这是我用 Haskell 的 Endofunctor 做不到的。
我找不到与此 Functor 相同方式定义的 Apply 或 Applicative 类型类的任何内容。那些也可以做同样的事情吗?
如果我错了,请纠正我。但是对于 Monad 就不行了,因为它真的是 Endofunctor 的一个实例?
【问题讨论】:
标签: haskell metaprogramming dsl