17

通常你有类似 an Applicativewithoutpure或类似 a Monad, but without的东西return。semigroupoid包用和覆盖了这些情况。现在我处于类似的情况,我无法定义一个有意义的函数,但我认为其他函数会很有意义。ApplyBindArrowarr

我定义了一个包含函数的类型,它是反向函数:

import Control.Category

data Rev a b = Rev (a -> b) (b -> a)

reverse (Rev f g) = Rev g f
apply (Rev f _) x = f x
applyReverse (Rev _ g) y = g y
compose (Rev f f') (Rev g g') = Rev ((Prelude..) f g) ((Prelude..) g' f') 

instance Category Rev where
  id = Rev Prelude.id Prelude.id
  (.) x y = compose x y 

现在我无法实现Arrow,但更弱一些:

--"Ow" is an "Arrow" without "arr"
class Category a => Ow a where
  first :: a b c -> a (b,d) (c,d)
  first f = stars f Control.Category.id

  second :: a b c -> a (d,b) (d,c)
  second f = stars Control.Category.id f

  --same as (***)
  stars :: a b c -> a b' c' -> a (b,b') (c,c')

 ...
 import Control.Arrow 

 instance Ow Rev where
    stars (Rev f f') (Rev g g') = Rev (f *** g) (f' *** g')  

我认为我无法实现 , 的等价物&&&,因为它被定义为f &&& g = arr (\b -> (b,b)) >>> f *** g,并且(\b -> (b,b))不可逆。不过,您认为这个较弱的类型类可能有用吗?从理论的角度来看,它甚至有意义吗?

4

2 回答 2

10

这种方法在“There and Back Again:可逆编程的箭头”中进行了探讨:http ://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.153.9383

正是由于您遇到的原因,结果证明这是一种糟糕的方法,并没有被更广泛地采用。最近,Tillmann Rendel 提出了一种令人愉快的可逆语法方法,用部分同构代替 biarrows ( http://www.informatik.uni-marburg.de/~rendel/rendel10invertible.pdf )。这已被打包在 hackage 上供人们使用和玩耍:http ://hackage.haskell.org/package/invertible-syntax

也就是说,我认为没有箭头arr是有一定意义的。我只是不认为这样的东西是捕捉可逆函数的合适工具。

编辑:还有 Adam Megacz 的 Generalized Arrows (http://www.cs.berkeley.edu/~megacz/garrows/)。这些可能对于可逆编程也没有用(尽管基本类型类似乎确实是可逆的),但它们确实在其他情况下有用arr,但其他箭头操作可能是有意义的。

于 2011-08-09T14:28:37.123 回答
9

从类别理论的角度来看,Category类型类描述了任何类别,其箭头可以在 Haskell 中通过类型构造函数直接描述。几乎任何你想在此之上构建的附加特性,以新的原始箭头或箭头构建函数的形式,如果你可以使用总函数来实现它,在某种程度上都是有意义的。唯一需要注意的是,增加表现力可能会破坏其他要求,就像arr.

您的可逆函数的具体示例描述了一个所有箭头都是同构的类别。在完全和完全预期的令人震惊的转折中,Edward Kmett 已经在 Hackage 上实现了这一点。

arr函数大致相当于从 Haskell 函数到Arrow实例的函子(在范畴论意义上),使对象保持不变(即类型参数)。简单地删除arrfromArrow会给你......别的东西,它本身可能不是很有用,至少没有添加arr fstarr snd作为原语的等价物。

我相信为fstand添加原语snd,以及(&&&)从两个输入构建一个新箭头,应该为您提供一个包含products的类别,从理论的角度来看这是绝对明智的,并且与您的可逆箭头不兼容由于您找到的原因重新使用。

于 2011-08-09T15:24:54.177 回答