类型函数:标准 ML 中的 ('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c)
A function of type: ('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c) in Standard ML
在复习我的编程语言考试时,标准 ML 部分有一些类型推断问题,我可以通过在脑海中进行类型推断来解决大部分问题,而且我很擅长,但是有一个问题让我很困惑。
我必须编写一个函数类型:
('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c)
所以在我的脑海里,我应该有一个函数,它有两个参数,即函数 f 和 g。两者都带有一个参数 x,但我不能将该参数 x 添加到此函数中,因为它只需要两个参数,因此我只能使用 o 运算符创建此函数,用于管道函数。
所以 f 有一个参数,returns 有一个函数
g 接受一个参数, returns 一个值。
然后整体函数取一个值,returns取一个值。
我不确定如何仅使用 o 运算符来应用 f 和 g 来暗示这些规则。
任何帮助将不胜感激:)
谢谢,夏兰
正如您已经提到的,您需要编写一个具有两个参数的函数:
fun my_function f g = body
其中 f : 'a -> 'b -> 'c
和 g : 'a -> 'b
以及 body : 'a -> 'c
。
因为body
的类型是'a -> 'c
,我们可以写成
body = fn x => body'
其中 body'
的类型为 'c
和 x : 'a
。
观察,f x : 'b -> 'c
和 g x : 'b
,如果你有一个 'b -> 'c
类型的函数和一个 'b
类型的值,很容易构造一个值通过将函数应用于参数来键入 'c
:(f x) (g x)
.
以上给出了我们:
fun my_function f g = fn x => (f x) (g x)
或者,将 x
移动到定义的左侧,我们得到:
fun my_function f g x = f x (g x)
顺便说一下,如果您熟悉 combinatory logic,那么您可能会注意到结果函数表示 S
组合器。
在复习我的编程语言考试时,标准 ML 部分有一些类型推断问题,我可以通过在脑海中进行类型推断来解决大部分问题,而且我很擅长,但是有一个问题让我很困惑。
我必须编写一个函数类型:
('a -> ('b -> 'c)) -> ('a -> 'b) -> ('a -> 'c)
所以在我的脑海里,我应该有一个函数,它有两个参数,即函数 f 和 g。两者都带有一个参数 x,但我不能将该参数 x 添加到此函数中,因为它只需要两个参数,因此我只能使用 o 运算符创建此函数,用于管道函数。
所以 f 有一个参数,returns 有一个函数 g 接受一个参数, returns 一个值。 然后整体函数取一个值,returns取一个值。
我不确定如何仅使用 o 运算符来应用 f 和 g 来暗示这些规则。
任何帮助将不胜感激:) 谢谢,夏兰
正如您已经提到的,您需要编写一个具有两个参数的函数:
fun my_function f g = body
其中 f : 'a -> 'b -> 'c
和 g : 'a -> 'b
以及 body : 'a -> 'c
。
因为body
的类型是'a -> 'c
,我们可以写成
body = fn x => body'
其中 body'
的类型为 'c
和 x : 'a
。
观察,f x : 'b -> 'c
和 g x : 'b
,如果你有一个 'b -> 'c
类型的函数和一个 'b
类型的值,很容易构造一个值通过将函数应用于参数来键入 'c
:(f x) (g x)
.
以上给出了我们:
fun my_function f g = fn x => (f x) (g x)
或者,将 x
移动到定义的左侧,我们得到:
fun my_function f g x = f x (g x)
顺便说一下,如果您熟悉 combinatory logic,那么您可能会注意到结果函数表示 S
组合器。