我正在努力调和仿函数的数学概念和它的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)”。如果类型构造函数[](列表)是一个仿函数,那么它连接的两个类别是什么,以及它在两个类别之间映射对象和态射的确切方式
答案 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
,那么您需要定义Int
,a
和b
为c
的那些函数}秒。当集合中的对象是类型而不是值时,这很好。因此,您无法将它们设为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中定义的类型类,而且它们都是在运行时完成的。