ocaml函数调用List.fold\u left
填写为使用List.fold_left获取OCaml函数的管道指定的框架ocaml函数调用List.fold\u left,ocaml,Ocaml,填写为使用List.fold_left获取OCaml函数的管道指定的框架 val管道:('a->'a)列表->('a->'a) 这样pipe[f1;…;fn](其中f1,…,fn是函数!)返回函数f,这样对于任何x,我们都有fx返回结果fn(…(f2(f1 x)) 同样,您的任务是为折叠功能f和基本情况填写适当的值。 实现该函数后,应在OCaml提示符处获得以下行为: # pipe [] 3;; - : int = 3 # pipe [(fun x -> x+x); (fun x -
val管道:('a->'a)列表->('a->'a)
这样pipe[f1;…;fn]
(其中f1,…,fn
是函数!)返回函数f
,这样对于任何x
,我们都有fx
返回结果fn(…(f2(f1 x))
同样,您的任务是为折叠功能f
和基本情况填写适当的值。
实现该函数后,应在OCaml提示符处获得以下行为:
# pipe [] 3;;
- : int = 3
# pipe [(fun x -> x+x); (fun x -> x + 3)] 3 ;;
- : int = 9
# pipe [(fun x -> x + 3);(fun x-> x + x)] 3;;
- : int = 12
以下是您需要填写的代码:
let pipe fs =
let f a x = failwith "to be implemented" in
let base = failwith "to be implemented" in
List.fold_left f base fs
有人能帮我吗?您可能想先回答以下问题:
- 编写一个仅使用基本情况的管道调用示例
- 何时使用基本案例
- 基本案例的类型是什么
、f
和a
的更好名称是什么,即这些变量的作用是什么x
管道只接受一个参数。从管道类型(('a->'a)list->'a list
)中,您知道此参数具有类型('a->'a)list
,并且您应该返回类型('a->'a)
的一些值
现在,左折叠列表的类型为('b->'c->'b)->'b->'c List->'b
。但你知道:
它应该返回类型为'a->'a
的值,因此'b
将在此处用('a->'a)
实例化
第三个参数的类型是('a->'a)list
,因此'c list
将是('a->'a)list
,这里:'c
将再次用('a->'a)
实例化
您可以得出结论,您将在专用类型处使用List.fold_left
(是的,这是一口)
简而言之:如果管道必须返回一个函数并获取函数列表,那么base
本身必须是一个函数,f
必须获取两个函数并返回一个函数
base
应该是哪个函数<如果fs
是空列表,则返回code>base
,因此base
应该具有pipe[]
所期望的行为
f a x
应该如何组合a
和x
这两个类型均为'a->'a
的函数,并返回单个函数'a->'a
?我会让你在这里想出一个答案。但是你想要保持以下等式的直觉:
f(管道[f1;f2])f3=管道[f1;f2;f3]
(它适用于任何列表,而不仅仅是[f1;f2]
,但这个示例就足够了)。通过计算管道[f1;f2]
的含义与管道[f1;f2;f3]
之间的关系,您将能够定义组合函数f
请注意,您可以从以下不同的框架开始,以非常不同的方式编写pipe
函数:
let pipe fs x =
let f a x = failwith "to be implemented" in
let base = failwith "to be implemented" in
List.fold_left f base fs
在这种情况下,pipe
接受两个参数,一个是('a->'a)list
类型,另一个是'a
类型,整个返回值应该是'a
类型(一个值,而不是一个函数)f
接受一个函数('a->'a
)和一个值('a
)并返回一个值,base
只是一个值(您可以选择哪一个?)
我认为第二种方法稍微简单一些,因为抽象程度稍低,但如果你的老师让你使用第一个框架,可能是因为它会教你如何操作函数,以及如何构建构建函数的函数。我认为作业的一般规则是,你应该展示一些你已经尝试过的代码。如果没有什么可以评论的,如果不解决这个问题就很难提供帮助。我认为应该让base=0,但我不确定f部分。我该怎么做呢。let pipe fs=let f a x=a+x in let base=o in List.fold_left f base fsthis编译得很好,但在测试过程中它错了,我做错了什么?你写的没有意义。为什么你还要在一个多态函数中使用加法来处理任何数据类型
'a
,而不仅仅是整数?所以我仍然很困惑,我该怎么做呢?我建议你试着回答我文章中的问题。我引用:“基函数应该是哪个函数?”“fax应该如何组合这两个函数[…]?”
let pipe fs x =
let f a x = failwith "to be implemented" in
let base = failwith "to be implemented" in
List.fold_left f base fs