Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F Curried函数的有趣行为_F#_F# Scripting - Fatal编程技术网

F# F Curried函数的有趣行为

F# F Curried函数的有趣行为,f#,f#-scripting,F#,F# Scripting,我有一个函数 // Will perform a given function twice let twice f = (fun x -> f (f x)) 那我就有点像 // Take x add 1 let f x = x+1 根据我调用两次的方式,它的行为与左关联性不同 (twice (twice (twice (twice f)))) 0;; // Outputs 16 twice twice twice twice f 0;; // Outputs 65536 如果我再添加

我有一个函数

// Will perform a given function twice
let twice f = (fun x -> f (f x))
那我就有点像

// Take x add 1
let f x = x+1
根据我调用两次的方式,它的行为与左关联性不同

(twice (twice (twice (twice f)))) 0;; // Outputs 16
twice twice twice twice f 0;; // Outputs 65536
如果我再添加两次,我的程序就会发生堆栈溢出,但到目前为止,它的行为似乎没有模式,这让我发疯

设k为两次调用的次数

非咖喱是2^k得到答案

咖喱非常奇怪。假设1:当调用数小于4时,它看起来像2^2^k-1,但当k为4时,它的行为像2^2^k


有人看到这种模式吗?或者你能通过k=4来证明它吗?

这是一个简单的优先级规则,行为怪异,提示是65536=2^16。在第二种情况下,实际上创建了对f的指数级调用,而不是预期的线性增加

当您在第二个案例中展开一层时,您将得到

twice twice twice (twice twice twice (f)) 0

当你写两次以上的时候,术语的数量会呈指数增长这是一个简单的优先级规则,表现得很奇怪,提示是65536=2^16。在第二种情况下,实际上创建了对f的指数级调用,而不是预期的线性增加

当您在第二个案例中展开一层时,您将得到

twice twice twice (twice twice twice (f)) 0

当你写两次以上的时候,术语的数量会呈指数增长。事实上,这都是关于关联性的。当你写作时

let x1 = twice twice twice twice f 0
等于

let x11 = (((twice twice) twice) twice) f 0
这导致了调用顺序的指数增长:每两次调用应该调用两次fx。相反,它递归地调用自己,只有最内部的调用才会调用f

您可以查看函数的原型:

let y1: ( _ -> _ -> int) = twice twice twice twice
// val y1: ((int -> int) -> int -> int)
使关联性正常工作的最小代码是:

// note we need to specify a type here
let y2: ( _ -> _ -> int) = twice >> twice >> twice >> twice
// the same with all arguments
let x2 = (twice >> twice >> twice >> twice) f 0


事实上,这都是关于联想性的。当你写作时

let x1 = twice twice twice twice f 0
等于

let x11 = (((twice twice) twice) twice) f 0
这导致了调用顺序的指数增长:每两次调用应该调用两次fx。相反,它递归地调用自己,只有最内部的调用才会调用f

您可以查看函数的原型:

let y1: ( _ -> _ -> int) = twice twice twice twice
// val y1: ((int -> int) -> int -> int)
使关联性正常工作的最小代码是:

// note we need to specify a type here
let y2: ( _ -> _ -> int) = twice >> twice >> twice >> twice
// the same with all arguments
let x2 = (twice >> twice >> twice >> twice) f 0



是的,它与左、右关联的函数有关?是的,这就是F处理以这种顺序编写的东西的方式。是的,它与左、右关联的函数有关?是的,这就是F如何处理以这种顺序写的东西。虽然这是一个有趣的谜题,但我不认为这是分享这种东西的合适论坛。投票结束。如果没有人知道答案,我会在24小时后公布。祝你好运有编程谜题的网站;StackOverflow不是这样的网站。@OnorioCatenacci绝对同意。迈克·约翰,请编辑你的问题。这个问题是个好问题,但谜题挑战毁了它。你可以简单地说:如果你在给我们一个问题之后给我们一个谜题,那就假设你已经有了答案。为什么要问呢?事实上我发帖时不知道答案,这就是为什么挑战出现在编辑部分。无论如何,我会尽快纠正这个问题。好吧,现在这不是一个难题。我仍然很想知道这样一个用例在实际开发中是如何出现的。如果tweep是递归的,那么它就不是。如果tweep打算使用函数组合,据我所知,它不是。据我所知,你基本上是在问为什么无意义的代码不起作用。虽然这是一个有趣的谜题,但我不认为这是分享这类事情的合适论坛。投票结束。如果没有人知道答案,我会在24小时后公布。祝你好运有编程谜题的网站;StackOverflow不是这样的网站。@OnorioCatenacci绝对同意。迈克·约翰,请编辑你的问题。这个问题是个好问题,但谜题挑战毁了它。你可以简单地说:如果你在给我们一个问题之后给我们一个谜题,那就假设你已经有了答案。为什么要问呢?事实上我发帖时不知道答案,这就是为什么挑战出现在编辑部分。无论如何,我会尽快纠正这个问题。好吧,现在这不是一个难题。我仍然很想知道这样一个用例在实际开发中是如何出现的。如果tweep是递归的,那么它就不是。如果tweep打算使用函数组合,据我所知,它不是。据我所知,你基本上是在问为什么无意义的代码不起作用。我觉得很奇怪。为什么会复发?设两次f=f>>f。设t1=twitter两次,因此t1返回两次>>两次。让t2=两次>>两次。为什么t1的行为与t2不同?@tomasK tweep>>…>>两次又两次。。。两次分别以不同的线性和指数增长。只有在2*2=2^2的情况下应用两次,它们才能得到相等的值。当然,结果是清楚的,但我无法想象它是如何以及为什么以exp.方式调用的。我试图指出,两次给出的结果是两次>>两次,所以我不明白为什么它在这方面呈指数增长
当它两次看起来几乎和你的线性情况一样时,我觉得很奇怪。为什么会复发?设两次f=f>>f。设t1=twitter两次,因此t1返回两次>>两次。让t2=两次>>两次。为什么t1的行为与t2不同?@tomasK tweep>>…>>两次又两次。。。两次分别以不同的线性和指数增长。只有在2*2=2^2的情况下应用两次,它们才能得到相等的值。当然,结果是清楚的,但我无法想象它是如何以及为什么以exp.方式调用的。我试着指出,tweep tweep给出的结果是tweep>>两次,所以我不明白为什么在这种情况下它会呈指数增长,而实际上它看起来与线性情况tweep>>两次相同。