25

是否曾经通过主流函数式语言的库尝试过通过动词、副词、分叉等方式模拟 J 风格的超浓缩默契编程?

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

如果没有,是否有技术问题使这成为不可能,还是不值得做?

我对分叉之类的结构特别感兴趣,这些结构似乎与函数式编程中的基本概念并不直接对应。

4

2 回答 2

12

默示编程不是与 Haskell 中的组合逻辑或无意义的无点风格非常接近吗?例如,虽然我不知道 J 从我收集到的内容中,但“fork”将三个函数fgh和 一个参数x转换为一个表达式g (f x) (h x)。“将多个函数应用于单个参数,然后将结果依次应用于彼此”的操作是Curry 的Schönfinkel 的S组合子的推广,在 Haskell 中对应于ApplicativeReader monad 的实例。

forkHaskell 中与上面指定的结果匹配的组合器将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

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

如果没有,是否有技术问题使这成为不可能,还是不值得做?

至少在 Haskell 中,我认为主要问题是极其无点的风格被认为是混淆和不可读的,特别是在使用 Reader monad 拆分参数时。

于 2010-08-03T17:46:40.543 回答
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

于 2010-08-03T18:38:02.773 回答