是否通过主流函数式语言库来模拟J风格的副词,forks等?

时间:2010-08-03 17:03:38

标签: haskell f# functional-programming j tacit-programming

是否曾通过动词,副词,叉子等编写J风格的超级浓缩默契编程?是否曾尝试过主流函数式语言库?

如果是这样,结果有多成功?

如果没有,是否有技术问题导致这种情况不可能,或者它是否值得做?

我特别感兴趣的是像福克斯这样的结构似乎与函数式编程中的基本概念没有直接对应。

2 个答案:

答案 0 :(得分:12)

默认编程是否与Haskell中的组合逻辑或无意义无点样式非常接近?例如,虽然我从我收集的内容中不知道J,但“fork”会将三个函数fgh以及一个参数x转换为表达式g (f x) (h x)。 “将多个函数应用于单个参数,然后按顺序将结果相互应用”的操作是 Curry的Schönfinkel的 S 组合子的概括,并且在Haskell中对应于Reader monad的Applicative实例。

Haskell中的fork组合子使fork f g h x与上面指定的结果匹配,其类型为(t -> a) -> (a -> b -> c) -> (t -> b) -> t -> c。将此解释为使用Reader仿函数((->) t)并为任意仿函数重写它,类型变为f a -> (a -> b -> c) -> f b -> f c。交换前两个参数会给我们(a -> b -> c) -> f a -> f b -> f c,这是liftA2 / liftM2的类型。

因此,对于计算平均值的常见示例,fork +/ % #可以直接翻译为flip liftA2 sum (/) (fromIntegral . length),或者,如果有人更喜欢中缀Applicative组合子,则(/) <$> sum <*> fromIntegral . length

  

如果没有,是否有技术问题导致这种情况不可能,或者它是否值得做?

至少在Haskell中,我认为主要的问题是非常无点的样式被认为是混淆和不可读的,特别是在使用Reader monad来分割参数时。

答案 1 :(得分:8)

Camccann的讨论非常好。但请注意,此样式现在会导致两次遍历。

您可以编写合并遍历的组合子库。看这里: http://squing.blogspot.com/2008/11/beautiful-folding.html

这篇文章提供了以下写作平均值的例子:

meanF :: Fractional a => Fold a a
meanF = bothWith (/) sumF (after lengthF fromIntegral)

mean :: Fractional a => [a] -> a
mean = cfoldl' meanF

此外,Conal Eliott的后续帖子进一步概括了这一点: http://conal.net/blog/posts/enhancing-a-zip/

他将代码从他的帖子中拉到了可用于hackage的库中: http://hackage.haskell.org/package/ZipFold