在两个类别(与加法和乘法幺半群密切相关)中定义haskell中的仿函数的示例

时间:2015-05-22 08:24:56

标签: haskell categories functor

我正在努力调和仿函数的数学概念和它的haskell概念。 这篇文章http://brianshourd.com/posts/2012-10-26-tilt-functors-in-haskell.html解释了一下,但也许有人可以提供以下案例的例子:

假设我定义了以下类别

添加:对象是0,1,2,3,....,态射是(0 +),(1 +),(2 +),...(0+)是id变形。

Mul:对象是0,1,2,3,....,态射是(0 *),(1 *),(2 *),...(1 *)是id变形。

组成是(。)

如何在Haskell中定义这两个类别之间的仿函数(如果可能的话,如果我上面描述的是类别)

谢谢

编辑:根据@chi的建议,我正在澄清这个问题。我更感兴趣的是如何将这两个类别之间的任何仿函数放入/转换为Haskell(而不是存在一个,例如将任意数字映射到42,将任何态射映射到(1 *)作为@chi sugested)

编辑2:另一种问这个问题的方法是,你如何调和这两个语句“Functor类型类,基本上是可以映射的东西”和“给定类别C和D,一个算子F:C→ D是在C中为每个对象A分配D中的对象F(A)的规则。它还分配给每个态射f:C→态射F(f)的对象的A→B:F(A)→F( B)”。如果类型构造函数[](列表)是一个仿函数,那么它连接的两个类别是什么,以及它在两个类别之间映射对象和态射的确切方式

2 个答案:

答案 0 :(得分:1)

问题在于Haskell的Functor仅代表某种函子:从Haskell类型和函数(Hask)类别到其自身的函子。 Functor将类型映射到类型(Hask的对象)和函数函数(Hask的态射)。例如,Maybe Functor将任何给定类型a映射到类型Maybe a,并使用fmap将给定函数a -> b映射到函数Maybe a -> Maybe b

Hask的类别中,对象是类型,而态射是函数。您的类别将整数作为其对象,因此不符合Functor的模式,因此以这种形式提出问题并不是很有意义,至少不是{{1} }类型。

答案 1 :(得分:0)

如果你看一下Haskell中{ [Error: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall: 'write' } events.js:72 throw er; // Unhandled 'error' event ^ Error: write EPIPE at errnoException (net.js:901:11) at Object.afterWrite (net.js:718:19) npm ERR! weird error 8 npm WARN This failure might be due to the use of legacy binary "node" npm WARN For further explanations, please read /usr/share/doc/nodejs/README.Debian 的定义,你会看到这个。

class Category

请参阅,如果类别中的对象是class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c ,那么您需要定义Intabc的那些函数}秒。当集合中的对象是类型而不是值时,这很好。因此,您无法将它们设为Int的实例。

同时查看Category

fmap

你可以看到它只对类型有意义(因此在Hask类别中)。如果对象是整数,那么你会传递像 fmap :: (a -> b) -> f a -> f b 4 --> 5这样的态射,只适用于类型。

然后->是从(0+)Int的态射。你需要一个来自2到5的态射。

也许会是这样的:

Int

算子法则有效。特别是:

data IntMorphism = IdMorphism | IntMorphism Int Int

comp :: IntMorphism -> IntMorphism -> IntMorphism
comp IdMorphism m = m
comp m IdMorphism = m
comp  (IntMorphism y' z) (IntMorphism x y)
  | y /= y' = error "can't compose"
  | otherwise = IntMorphism x z

f1 :: Int -> Int
f1 = (+5)

f2 :: IntMorphism -> IntMorphism
f2 IdMorphism = IdMorphism
f2 (IntMorphism x y) = IntMorphism (f1 x) (f1 y)

当然,在处理值时,它不能使用base中定义的类型类,而且它们都是在运行时完成的。