Arrow的理解

看穿了Arrow,只需要记住一点它表示一个运算。专业点的说法它是运算的抽象。Arrow的定义如下:
>class Arrow arr where
> arr :: (a->b) -> arr a b
> (>>>) :: arr a b -> arr b c -> arr a c
> (&&&) :: arr a b -> arr a c -> arr a (b,c)
> first :: arr a b -> arr (a,c) (b,c)
对于任何一个arr,它是Arrow当且仅当它满足一下约束:
1. arr, 任何一个从a到b的运算都可以通过arr函数产生一个Arrow
2. >>> 中缀运算符, (a到b的运算)>>>(b到c的运算) 产生 (a到c的运算)
3. &&& 中缀运算符, (a到b的运算)&&&(a到c的运算) 产生 (a到(b,c)的运算),这里(b,c)表示一个二元组(pair)
4. first, (a到b的运算) 产生 ((a,c)到(b,c)的运算),也就是说任何一个a->b经过first作用后,产生一个仅对二元组第一分量起作用的函数

一个非常典型的例子是:
>addA :: (Arrow arr,Num b) => arr a b -> arr a b -> arr a b
>addA f g = f &&& g >>> arr (uncurry (+))
这里addA的签名中,=>之前为type variable的约束:arr必须是Arrow,b必须是Num(能够做加法)。uncurry (+)的意思是将加法(+是中缀操作,加上圆括号之后成为前缀操作)转换成一个(a,b) -> a+b的函数.
addA接受两个函数f g,产生一个新的运算,这个运算表达的效果如下:add x = f(x) + f(y),也就是说它将是一个接受一个参数x,分别作用f和g后相加。

当在最基本的Arrow的基础上添加一系列新的约束之后就可以构造出很多新的Arrow种类,最常见的有一下几种
>class Arrow arr => ArrowChoice arr where
> (|||) :: arr a c -> arrow b c -> arr (Either a b) c
(|||)运算可以接受a->c的运算和b到c的运算,产生一个从a或者b到c的运算。Either a b如其字面意思,这个结构可以包含一个a类型的元素或者一个b类型的元素

>class Arrow arr => ArrowApply arr where
> app :: arr (arr a b, a) b
ArrowApply如其名字,这样的Arrow,可以通过app函数,计算出这个运算的结果. (->)就是一个ArrowApply:
    > instance ArrowApply (->) where (->)是类型运算符,(->) a b即a->b,它实际上是一个很简单的Arrow
    > app (f,a) = f a

接下来几个尚未理解透彻,仅列之供参考
>class Arrow arr => ArrowZero arr where
> zeroArrow :: a b c

>class ArrowZero arr => ArrowPlus arr where
> (<+>) :: a b c -> a b c -> a b c

>newtype ArrowMonad arr a = ArrowMonad (arr () a)
>instance ArrowApply a => Monad (ArrowMonad a) where
> return x = ArrowMonad (arr (const x))
> ArrowMonad m >>= f = ArrowMonad (m >>>
                                                            arr (x->let ArrowMonad h = f x
                                                                         in (h,()))
                                                            >>> app)

感谢水木社区FP版前版主faint前辈,没有他的帮助,完全还在混沌之中…

此条目发表在FP分类目录。将固定链接加入收藏夹。

5 Responses to Arrow的理解

  1. 白云驿站说道:

    看不懂的,我还是不要评论的好…踩两个脚印吧…踩踩踩

  2. 佳森说道:

    貌似你一共踩了三下,共三个脚印的….哈哈…多踩了一下哦

  3. Unknown说道:

    wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you wWorld of Warcraft gold ordered!

    wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold -187757776190071

  4. Unknown说道:

    wow gold!All wow gold US Server 24.99$/1000G on sell! Cheap wow gold,wow gold,wow gold,Buy Cheapest/Safe/Fast WoW US EU wow gold Power leveling wow gold from the time you wWorld of Warcraft gold ordered!

    wow power leveling wow power leveling power leveling wow power leveling wow powerleveling wow power levelingcheap wow power leveling wow power leveling buy wow power leveling wow power leveling buy power leveling wow power leveling cheap power leveling wow power leveling wow power leveling wow power leveling wow powerleveling wow power leveling power leveling wow power leveling wow powerleveling wow power leveling buy rolex cheap rolex wow gold wow gold wow gold wow gold -125666286371868

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 登出 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 登出 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 登出 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 登出 /  更改 )

Connecting to %s