假设我有f :: u -> v -> w和g :: x -> y -> z。我想要的是h :: (u,x) -> (v,y) -> (w,z)。 所以,我可以去了解这个手动: h (u,x) (v,y) = (f u v, g x y)
哪来的乐趣呢? 使用(***)我可以中途有: (f *** g) :: (u,x) -> (v -> w, y -> z)
但我想不出如何获取最后一英里。
通常你有类似Applicative而没有pure,或类似Monad,但没有return。 semigroupoid包裹涵盖这些案件与Apply和Bind。现在我处于类似的情况,涉及Arrow,我无法定义一个有意义的arr函数,但我认为其他函数会非常有意义。 我定义保存函数类型和它的反向功能: import Control.Category
data Rev a b = Rev (a -> b)
一些使用箭头的函数在成对使用时非常方便。但我不明白这些功能的类型是如何与一对相结合的。一般来说,我发现箭头相关函数的类型相当混乱。 例如,我们有first :: a b c -> a (b, d) (c, d),这对我来说意义不大。但它可以被用来,比如说,增加一对的第一个数字: Prelude Control.Arrow> :t first (+1)
first (+1) :: (Num b)
我在哪里可以找到源代码,是隐藏语言编译 {-# LANGUAGE Arrows #-}
我读过根据文件(如Paterson, A New Notation for Arrows),所以理论上有什么情况是清楚的后面。现在我想看看,它是如何被转换为源代码的。 我的所有搜寻仅供参考GHC的用户指南或Control.Arrow的来源。 我在这里错过了什么吗?
在箭头符号中,可以使用rec关键字来编写递归定义。例如: rec
name <- function -< input
input <- otherFunction -< name
这怎么能评估?它似乎会进入一个无限循环或什么东西。我知道它评估到循环箭头组合器,但我不明白这是如何工作。 编辑:这个权力的例子真的很有帮助。尽管如此,你会如何写这个符号?我假设你需要使用rec。