как бороться с передачей входных данных в функцию с несколькими входами, но входные данные не являются последними входными данными функции? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь реализовать функцию, скажем, f1, и я использую ранее определенную функцию, скажем, f2, чтобы реализовать функцию f1. У f2 многократный ввод, например, «f2 input1 input2 input3 ...». f1 вернуть W.L.O.G input2 из f2. Как я могу правильно сделать так, чтобы компилятор знал, что я хочу, чтобы f2 принял вывод f1 в качестве его input2 при использовании |>, как в этом выражении: "f1 arg1 arg2 ... |> f2 input1 _ input3 ..."? Если вы посмотрите на мои коды, функция split принимает список, а затем целое число, но я хочу дать этой функции ввод списка с помощью |>. Компилятор выдает ошибку «split e» в моем срезе функции. Ожидается список, а не число «e», когда мы делаем «l |> (split e)». Вы видите, что срез функции, который я определяю, не соответствует порядку своих аргументов, как того требуют упражнения. Я сделал это так, чтобы я мог снова использовать |>, чтобы дать срезу ввод списка в другой функции f3, которая использует функцию среза. Мне интересно, если это необходимо?

Это вопрос 18 из его веб-сайта для упражнений Окамля: "С учетом двух индексов, i и k, срез является списком, содержащим элементы между i-м и k-м элементами исходного списка (включая оба ограничения). Начните считать элементы с 0 (это способ, которым List элементы номеров модулей). "

(*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])

Вот как должен работать слайс:

slice ["a"; "b"; "c"; "d"; "e"; "f"; "f"; "h"; "i"; "j"] 2 6 ;;

  • : список строк = ["c"; «Г»; «Е»; «Е»; "Г"]

1 Ответ

0 голосов
/ 12 января 2019

Вы можете использовать различные хитрые высокоуровневые функции, чтобы переупорядочить параметры вашей второй функции, но, на мой взгляд, нужно просто укусить пулю и использовать let. Использование |> не обязательно при составлении функций!

Вместо этого:

f x |> g

Вы можете сказать это:

let r = f x in
g r

Так что для вашего случая вы можете сказать:

let r = f1 input1 input2 input3 in
f2 x r y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...