Haskell J风格副词、fork等是否通过主流函数式语言中的库进行了模仿?

Haskell J风格副词、fork等是否通过主流函数式语言中的库进行了模仿?,haskell,f#,functional-programming,j,tacit-programming,Haskell,F#,Functional Programming,J,Tacit Programming,有没有通过主流函数式语言的库尝试过通过动词、副词、叉等模仿J风格的超浓缩默契编程 如果是,结果有多成功 如果没有,是否有技术问题使得这不可能,或者根本不值得这么做 我特别感兴趣的是像forks这样的结构,它们似乎与函数式编程中的基本概念不直接对应。默认编程不是与Haskell中的组合逻辑或无意义点风格非常接近吗?例如,虽然我从收集的信息中不知道J,但“fork”将三个函数f、g、和h以及一个参数x转换为表达式g(fx)(hx)。“将多个函数应用于单个参数,然后按顺序将结果应用于彼此”的操作是Cu

有没有通过主流函数式语言的库尝试过通过动词、副词、叉等模仿J风格的超浓缩默契编程

如果是,结果有多成功

如果没有,是否有技术问题使得这不可能,或者根本不值得这么做


我特别感兴趣的是像forks这样的结构,它们似乎与函数式编程中的基本概念不直接对应。

默认编程不是与Haskell中的组合逻辑或无意义点风格非常接近吗?例如,虽然我从收集的信息中不知道J,但“fork”将三个函数
f
g
、和
h
以及一个参数
x
转换为表达式
g(fx)(hx)
。“将多个函数应用于单个参数,然后按顺序将结果应用于彼此”的操作是Curry的Schönfinkel的s组合器的推广,在Haskell中对应于Reader monad的
Applicative
实例

Haskell中的
fork
组合器,如果
fork f g h x
与上面指定的结果匹配,则类型为
(t->A)->(A->b->c)->(t->b)->t->c
。将其解释为使用读取器函子
(->)t
,并为任意函子重写它,类型将变为
fa->(a->b->c)->fb->fc
。交换前两个参数可以得到
(a->b->c)->fa->fb->fc
,这是
liftA2
/
liftM2
的类型

因此,对于计算平均值的常见示例,fork
+/%#
可以直接转换为
翻转liftA2 sum(/)(fromIntegral.length)
,或者,如果您更喜欢中缀
实用的
组合符,则可以转换为
(/)sum fromIntegral。长度

如果没有,是否有技术问题使得这不可能,或者根本不值得这么做


至少在哈斯克尔看来,我认为主要的问题是极端无点风格被认为是模糊和不可读的,特别是在使用Reader monad分割参数时。

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

您可以编写一个合并遍历的组合器库。请看这里:

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

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

mean :: Fractional a => [a] -> a
mean = cfoldl' meanF
此外,Conal Eliott的后续文章进一步概括了这一点:

他将自己帖子中的代码拉到一个可以从hackage上获得的库中:

+1——我实际上只是在谈论风格,而不是实现。有很多问题与实际操作相关,其中大部分可以构建为递归组合器库。另请参阅“流融合”了解相关概念。非常有趣-这似乎真的模拟了J解释器所做的某些事情。如果以一种克制的方式使用,它们可以产生相当优雅的代码。你知道这些想法在实践中流行了多少吗?这个答案意味着lst=lst |>dup(sum,length)|>uncurry(div),其中dup(f1,f2)=\x->(f1 x,f2 x)和a |>f=f aAs有点令人沮丧,第二句话说“…虽然我不知道J…”,在
j
标签中,我获得了第二高的投票数。所以需要更多的J程序员!此外,这个问题现在在
J
标签中的得票最多。而且,我从未真正编写和执行过
J
程序。不过我想我知道-事实上,1995年我在多伦多的Ken Inverson家住了一个周末(我爸爸去Ken家做
J
的工作,我在CMU读博士学位-是的,我想我是第二代PLer)。顺便说一句-答案不错。我也有类似的想法,但你说得更好。一个区别是,在
J
中,fork和hook在语法上是隐式的。我怀疑这是否可以被模仿,而且我个人认为暗含的叉子和钩子对我来说似乎要走得很远。另一个区别是sclv所涵盖的实现——而J实际上非常有效地处理大型(甚至是大型)数组。@RD1:一些东西可以通过可怕的元编程技巧变得更加隐式,就像编写多元函数的技巧一样,但这仍然是不一样的,会使实际写“动词”更痛苦。使用一些模板Haskell/Quasiqueotation magic可以捕捉到真实的Iverson Backus味道,作为奖励,TH还可以执行一些融合优化等以提高效率。但是在这一点上,你几乎不再写Haskell了……关于应用程序的风格,请参阅mcbride的she预处理器的习惯用法括号:(顺便说一下,这应该可以让你编写非常漂亮的解析器)。我不知道,但我喜欢这个问题!