Function 为什么这个标准ML表达式等于11?
有人能给我解释一下并帮助我理解为什么下面的表达式在标准ML中等于11吗?非常感谢您的帮助Function 为什么这个标准ML表达式等于11?,function,pattern-matching,anonymous-function,sml,smlnj,Function,Pattern Matching,Anonymous Function,Sml,Smlnj,有人能给我解释一下并帮助我理解为什么下面的表达式在标准ML中等于11吗?非常感谢您的帮助 (fn f => (fn g => f(g 2))) (fn n => n+3) (fn n => n*4) 因为这看起来像是家庭作业,我只想给你一个提示 您可以做的一件事是删除一些lambda表达式,以支持显式函数定义 例如: fun h f = (fn g => f(g 2)) fun f n = n + 3 fun g n = n*4 然后——看看你是否能猜出为什
(fn f => (fn g => f(g 2))) (fn n => n+3) (fn n => n*4)
因为这看起来像是家庭作业,我只想给你一个提示 您可以做的一件事是删除一些lambda表达式,以支持显式函数定义 例如:
fun h f = (fn g => f(g 2))
fun f n = n + 3
fun g n = n*4
然后——看看你是否能猜出为什么hfg
的计算结果是11
另一个提示是,在ML函数中,应用程序是左关联的,因此hfg
与
(h f) g
这意味着应用于函数g
的函数hf
(h
返回函数)。请注意,h
返回的函数是将函数(如g
)作为输入并返回整数(如11)作为输出的函数
作为最后一个提示,您将如何使用两个简单的函数从数字2到数字11?f和
g
?既然这看起来像是家庭作业,我只想给出一个提示
您可以做的一件事是删除一些lambda表达式,以支持显式函数定义
例如:
fun h f = (fn g => f(g 2))
fun f n = n + 3
fun g n = n*4
然后——看看你是否能猜出为什么hfg
的计算结果是11
另一个提示是,在ML函数中,应用程序是左关联的,因此hfg
与
(h f) g
这意味着应用于函数g
的函数hf
(h
返回函数)。请注意,h
返回的函数是将函数(如g
)作为输入并返回整数(如11)作为输出的函数
作为最后一个提示,使用两个简单的函数
f
和g
?可以计算表达式,从数字2到数字11是如何得到的:
(fn f => (fn g => f(g 2))) (fn n => n+3) (fn n => n*4)
这里,将f
替换为(fn n=>n+3)
,使其成为
(fn g => (fn n => n+3)(g 2)) (fn n => n*4)
(fn n => n+3)((fn n => n*4) 2)
同样,将g
替换为(fn n=>n*4)
,使其成为
(fn g => (fn n => n+3)(g 2)) (fn n => n*4)
(fn n => n+3)((fn n => n*4) 2)
类似地,将第一个
n
替换为((fn n=>n*4)2)
,或将第二个n
替换为2
,您可以计算表达式:
(fn f => (fn g => f(g 2))) (fn n => n+3) (fn n => n*4)
这里,将f
替换为(fn n=>n+3)
,使其成为
(fn g => (fn n => n+3)(g 2)) (fn n => n*4)
(fn n => n+3)((fn n => n*4) 2)
同样,将g
替换为(fn n=>n*4)
,使其成为
(fn g => (fn n => n+3)(g 2)) (fn n => n*4)
(fn n => n+3)((fn n => n*4) 2)
同样地,将第一个
n
替换为((fn n=>n*4)2)
,或者将第二个n
替换为2
,顺便说一句,你可能想修改你关于堆栈溢出的问题风格,从已经提出的更一般的问题和答案中汲取经验。在“为什么是11?”和“为什么是11”之间有某种缺失的联系,而编写优秀问题的艺术是在使问题变得足够具体(就像你所做的那样)和将问题概括到某一点之间的平衡,如果问题的表述稍有不同,例如,如果结果不是11,则可以使用答案(从而找到答案)。-)顺便说一句,您可能想修改StackOverflow上的问题风格,从已经提出的更一般的问题和答案中汲取经验。在“为什么是11?”和“为什么是11”之间有某种缺失的联系,而编写优秀问题的艺术是在使问题变得足够具体(就像你所做的那样)和将问题概括到某一点之间的平衡,如果问题的表述稍有不同,例如,如果结果不是11,则可以使用答案(从而找到答案)。-)