如何处理对具有多个输入的功能的输入进行管道输入,但管道输入不是功能的最后输入?

时间:2019-01-12 14:42:00

标签: ocaml

我正在尝试实现一个函数,例如f1,我正在使用先前定义的函数(例如f2)来实现f1。 f2具有多个输入,例如“ f2 input1 input2 input3 ...”。 f1返回f2的W.L.O.G input2。当使用|>时,如以下语句所示,如何正确地使编译器知道我希望f2接受f1的输出作为其input2:“ f1 arg1 arg2 ... |> f2 input1 _ input3 ...”?如果您查看我的代码,split函数将使用一个列表,然后是一个整数,但是我想使用|>为该函数提供一个列表输入。编译器在我的函数片中的“ split e”上给出了错误。当我们执行“ l |>(split e)”时,它期望一个列表而不是数字“ e”。您会看到,我定义的功能片未遵循练习所要求的参数顺序。我这样做是为了可以再次使用|>在另一个使用slice函数的函数f3中为slice提供列表输入。我想知道这是否必要吗?

这是t his website中关于Ocaml练习的问题18: “给定两个索引i和k,切片是包含原始列表的第i个和第k个元素之间的元素的列表(包括两个限制)。从0开始计算元素(这是列表的方式模块编号元素)。”

(*Question 17*) 
let split (l: 'a list) (m : int)  =
  let rec helper ll mm acc=
    match ll with
    |[]-> (acc,[])
    |q::w -> if mm=m then ((acc@[q]),w) else helper w (mm+1) (acc@[q])
  in helper l 1 []



(*Question 18 *)
let slice (b : int) (e :int) (l :'a list) =
  let k=(fst (l |> (split e)) |> (split b)) in
  (match snd k with
   |[]->fst k
   |a::_ -> (fst k)@[a])

以下是切片应如何工作:

切片[“ a”;“ b”;“ c”;“ d”;“ e”;“ f”;“ g”;“ h”;“ i”;“ j”] 2 6 ;; < / p>

  • :字符串列表= [“ c”; “ d”; “ e”; “F”; “ g”]

1 个答案:

答案 0 :(得分:1)

您可以使用各种棘手的高级函数对第二个函数的参数进行重新排序,但是在我看来,要做的只是硬着头皮使用let。组成函数时,|>的使用不是强制性的!

代替此:

f x |> g

您可以这样说:

let r = f x in
g r

对于您的情况,您可以说:

let r = f1 input1 input2 input3 in
f2 x r y