Functional programming ';a->';b函数在ml中

Functional programming ';a->';b函数在ml中,functional-programming,sml,type-signature,Functional Programming,Sml,Type Signature,是否可以在sml/nj中编写带有签名的函数: fn : 'a -> 'b fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c fn : 'a -> 'b foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c 我最初的目的是制作一个带有签名的函数: fn : 'a -> 'b fn: ( 'a ->

是否可以在sml/nj中编写带有签名的函数:

fn : 'a -> 'b
fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c
fn : 'a -> 'b
foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c
我最初的目的是制作一个带有签名的函数:

fn : 'a -> 'b
fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c
fn : 'a -> 'b
foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c
经过多次尝试,我得到:

fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c -> 'c

但是我从来没有按要求成功地实现过,我意识到,如果我能够实现从“a”到“b”的函数,我可以找到解决方案。

只有两种可能的实现提供了
'a->'b
函数,它们很少有用:

抛出异常 无限循环
我有一种预感,在翻译过程中丢失了一些细节,因为您给出的第二种类型签名没有多大意义。

只有两种可能的实现提供了
'a->'b
函数,它们很少有用:

抛出异常 无限循环 我有一种预感,一些细节在翻译中丢失了,因为你给出的第二种类型的签名没有多大意义

是否可以在sml/nj中编写带有签名的函数:

fn : 'a -> 'b
fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c
fn : 'a -> 'b
foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c
是的——请看(并养成按要求检查副本的习惯)。-)

我最初的目的是制作一个带有签名的函数:

fn : 'a -> 'b
fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c
fn : 'a -> 'b
foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c
可能是这样的:

exception Done
fun foo f g x y _ = (f x; g y; raise Done)
fun foo f g x y _ =
    let fun inf () = inf ()
    in f x; g y; inf () end
或者像这样:

exception Done
fun foo f g x y _ = (f x; g y; raise Done)
fun foo f g x y _ =
    let fun inf () = inf ()
    in f x; g y; inf () end
使这些函数与类型为
'a->'b
的函数类似的实际上是
'c
部分,因为该类型与输入类型无关,就像
'b
'a
无关一样。
foo
中的
'a
s和
'b
s实际上起到了作用,允许一些函数应用(
fx
gy
),即使这些值不能作为结果的一部分,因为您没有类型安全的方法将
'a
'b
类型的值转换为
'c
类型的值

是否可以在sml/nj中编写带有签名的函数:

fn : 'a -> 'b
fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c
fn : 'a -> 'b
foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c
是的——请看(并养成按要求检查副本的习惯)。-)

我最初的目的是制作一个带有签名的函数:

fn : 'a -> 'b
fn: ( 'a -> 'b ) -> ( 'b -> 'a ) -> 'a -> 'b -> 'c
fn : 'a -> 'b
foo : ('a -> 'b) -> ('b -> 'a) -> 'a -> 'b -> 'c
可能是这样的:

exception Done
fun foo f g x y _ = (f x; g y; raise Done)
fun foo f g x y _ =
    let fun inf () = inf ()
    in f x; g y; inf () end
或者像这样:

exception Done
fun foo f g x y _ = (f x; g y; raise Done)
fun foo f g x y _ =
    let fun inf () = inf ()
    in f x; g y; inf () end

使这些函数与类型为
'a->'b
的函数类似的实际上是
'c
部分,因为该类型与输入类型无关,就像
'b
'a
无关一样。
foo
中的
'a
s和
'b
s实际上起到了作用,允许一些函数应用(
fx
gy
),即使这些值不能作为结果的一部分,既然您没有类型安全的方法将
'a
'b
类型的值转换为
'c
类型的值,那么哪一种方法没有多大意义?@AdamElgressy
fn:('a->'b)->('b->'a)->'a->'b->'c
。我不知道这样一个家庭作业的目的是什么。不管怎样,我使用了无限循环的方法并成功了,谢谢!哪一个没有多大意义?@AdamElgressy
fn:('a->'b)->('b->'a)->'a->'b->'c
。我不知道这样一个家庭作业的目的是什么。不管怎样,我使用了无限循环的方法并成功了,谢谢!这个问题是的复制品。这个问题是的复制品。我找了一个类似的问题,但没有找到。关于如何找到更好的问题,有什么建议吗?说到这里,我只需要得到两个函数作为curry,然后一个'a变量作为curry,然后一个'b变量作为curry,然后返回一个'c变量。无论如何,我发现你写的东西对我理解ml中的“a->”b函数现象很有帮助,所以感谢你的帮助that@AdamElgressy:你说得对,这个问题很难找到,因为所有奇怪的符号。我修改了我的答案,使之更具体一些。我寻找了一个类似的问题,但我没有发现,关于如何找到更好的答案,有什么建议吗?说到这里,我只需要得到两个函数作为curry,然后一个'a变量作为curry,然后一个'b变量作为curry,然后返回一个'c变量。无论如何,我发现你写的东西对我理解ml中的“a->”b函数现象很有帮助,所以感谢你的帮助that@AdamElgressy:你说得对,这个问题很难找到,因为所有奇怪的符号。我把答案修改得更具体一点。