好吧,尴尬,我发布了我需要解释的代码.具体来说,它首先将绝对值和减法链接在一起,然后进行排序,同时根本不必提及参数和参数,因为可以加入这些函数"动词"的"副词"的存在
什么(非APL类型)语言支持这种无参数函数组合(我有一个模糊的想法,它与monad/dyad和rank的概念密切相关,但很难得到一个特别容易理解的只是从阅读维基百科的图片)我怎么称呼这个概念?
在J编程语言中,
-: i. 5
Run Code Online (Sandbox Code Playgroud)
上面的函数计算[0,4]中所有整数的一半.现在让我们说我想重写 - :函数,只是为了它的乐趣.到目前为止,我最好的猜测是
]&%.2
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有削减它.你怎么做呢?
(2&*~) 15 7 3 1
Run Code Online (Sandbox Code Playgroud)
以上是这句话.最后是追踪和最终结果.我明白这个短语是monad,我明白因为它有左右参数.如果您运行'15 7 3 1(2&*)15 7 3 1',则会发生相同的输出.我也得到了正确的表是2到1,3,7,15的幂,而其他条目是它们的基数乘以2的幂,但我只是不明白为什么.
在一个相关的说明中,这是一个来自Rosetta Code网站上的ethopian乘法的短语(实际上,这也是我试图弄清楚这一点)和'(1>.<.@ - :)^: a:'是这句话.
(1>.<.@-:)^:a: 27
27 13 6 3 1
Run Code Online (Sandbox Code Playgroud)
但是(1>.<.@ - :) ^:27会返回一个自己的盒子版本,我希望它会运行27次.
在三个相关问题的最后,(这些都与分解道德繁殖代码有关),完整代码如下:
double =: 2&*
halve =: %&2 NB. or the primitive -:
odd =: 2&|
ethiop =: +/@(odd@] # (double~ <@#)) (1>.<.@halve)^:a:
Run Code Online (Sandbox Code Playgroud)
这可以简单地替换为:
ethiop =: +/@(2&|@] # (2&*~ <@#)) (1>.<.@-:)^:a:
Run Code Online (Sandbox Code Playgroud)
这很好!成功冲了过去,当我想到时,我完全脱离了悬崖,在命令行上有一个monadic double:
+: 98
196
Run Code Online (Sandbox Code Playgroud)
并且双精度运算符必须比具有附加常量的双精度快,可能是双精度变换,所以我会这么认为
ethiop =: +/@(2&|@] # (+:~ <@#)) (1>.<.@-:)^:a:
Run Code Online (Sandbox Code Playgroud)
会工作......但事实并非如此.
我已经尝试了大写字母,连词等等,没有任何东西能让它起作用,它总是说"域名错误".我开始认为代码依赖于被称为monad的二元组以一种我无法获得的方式创建双倍表.
唯一的好处是J动词奇数与测试奇数无关.
任何人都可以向我解释这些事情,也许有英文解释该程序如何工作?不是算法如何工作,它是如何实现算法的.我记得1970年我在玩IBM 1130 APL的时候.这是一个8k字的APL翻译,不用说,它是有限的.例如,它有一个滚动但没有交易.解释器自行进出内存,1130支持代码覆盖,它将子程序分成组,当一个组调用另一个组时,它将从磁盘加载新组(是的,在8k中进行伪交换).所以我编写了交易的版本,使用各种方案,并且随机地,我们会找到一个可以逐步进入和退出而不寻求的版本,无论用多少行编写多少以及有多少解释器操作将运行10次像其他任何一样快.我不知道我在做什么,我会继续添加ravels和毫无意义的任务,并在各行之间打破语句或将它们组合起来,直到我得到一个不用寻求的方式运行.(正在寻求的52 52交易可能需要45秒).
然后昨晚我在J.计算了第150,000个Fibonacci数字.它必须是64位版本,花了一个小时,17分钟.我使用了精确的算术,数字有31349位数,它开始1012838344936638038 ......我意识到1130可能永远不会计算出这个,这个数字不合适,因为你需要三个和最大的一个有32k …
这里与我的问题密切相关,但实际上是一个不同的问题......
考虑以下F#: -
type TestClass() =
let getValFromMap m k = Map.find k m
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
module TestModule =
let getValFromMap m k = Map.find k m
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
Run Code Online (Sandbox Code Playgroud)
在类案例和模块案例中,getValFromMapPartial并getValFromMapPartialAndTacit以非常不同的方式运行,并以不同方式编译为IL.在类和模块的情况下,前者的行为类似于真正的语法函数,后者的行为类似于lambda计算函数(我知道这要归功于用户Marc Sigrist).
在模块的情况下,类型签名似乎是正确的: -
getValFromMapPartial : key:string -> int
getValFromMapPartialAndTacit …Run Code Online (Sandbox Code Playgroud) 为什么2(*i.)5评估0 2 4 6 8?
很明显2*i.5,但是(),从右到左创建一个钩子并进行评估似乎我们得到了
(*i.)5 == 0 5 10 15 20
Run Code Online (Sandbox Code Playgroud)
并且2不会对该列表采取行动 - 所以我哪里错了?
我是Haskell的新手,并尝试执行以下操作:
takeWhile (length < 3) [[1],[1,2],[1..3],[1..4]].但这给出了一个错误,我认为是因为takeWhile会测试length < 3 [1]而不是length [1] < 3,这是可行的.我是否要制作[[1],[1,2],[1..3],[1..4]]长度列表然后为长度列表做一个takeWhile (< 3)?或者有没有办法通过直接测试长度来做到这一点?
如何以无点样式重写以下表达式?
p x y = x*x + y
Run Code Online (Sandbox Code Playgroud)
使用lambda演算我做了以下:
p = \x -> \y -> (+) ((*) x x) y
= \x -> (+) ((*) x x) -- here start my problem
= \x -> ((+) . ((*) x )) x
... ?
Run Code Online (Sandbox Code Playgroud) 我开始学习Haskell,所以我也需要了解curring(这也是我第一次看到这种技术)。我想我知道在某些情况下,数字化仅“消除”参数之一是如何工作的。就像在下一个示例中,我试图计算4个数字的乘积。这是未固化的函数:
prod :: Integer->Integer->Integer->Integer->Integer
prod x y z t = x * y * z * t
Run Code Online (Sandbox Code Playgroud)
这是咖喱函数:
prod' :: Integer->Integer->Integer->Integer->Integer
prod' x y z = (*) (x*y*z)
Run Code Online (Sandbox Code Playgroud)
但是我不明白如何继续这种动态变化,例如仅使用两个参数来执行相同的功能,依此类推:
prod'' :: Integer->Integer->Integer->Integer->Integer
prod'' x y =
Run Code Online (Sandbox Code Playgroud)