Я пытаюсь реализовать функцию, скажем, 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"; «Г»; «Е»; «Е»; "Г"]