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>>两次相同。