ocaml函数调用List.fold\u left

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 -

填写为使用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 -> 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