Мне нужно написать функцию sum
, которая принимает в качестве первого аргумента значение n
. Второй аргумент — это функция f
, так что sum вычисляет сумму Гаусса.
На втором этапе я должен реализовать sum_gauss (int->int)
, используя sum
и лямбда-выражение.
Это моя идея для функции sum
:
let rec sum (n:int) (f:int->int) : int =
if n < 1 then 0
else sum (n-1) f + f n
И это sum_gauss
, который выдает ошибку:
let sum_gauss = sum ((i:int) -> fun (i:int) : int -> i)
Ошибка:
Line 1, characters 30-32:
Error: Syntax error: ')' expected
Line 1, characters 22-23:
This '(' might be unmatched
Я не понимаю, почему возникает эта ошибка, потому что каждой левой скобке соответствует правая скобка.
Спасибо за ваш комментарий. Я должен работать с лямбда-выражениями. Вот почему я написал стрелки.
Есть несколько способов ввести лямбда-выражения в OCaml, но самый простой из них — тот, который вы уже используете, с помощью fun arg -> code
. Кроме того, обратите внимание, что в OCaml предусмотрен вывод типов, поэтому вам не нужно явно вводить все ваши переменные.
Как мне тогда правильно написать лямбда-выражение?
Переписывание с очисткой вывода типов:
let rec sum n f =
if n < 1 then 0
else sum (n-1) f + f n
Если вы хотите добавить все числа от 1 до n
. вам нужно передать число и функцию в sum_gauss
как отдельные аргументы.
let sum_gauss n = sum n (fun x -> x)
Конечно, fun x -> x
на самом деле просто Fun.id
.
let sum_gauss n = sum n Fun.id
Если вам хочется быть очень умным и вы уже используете модуль Fun
, вы можете использовать Fun.flip
, чтобы передать Fun.id
в качестве второго аргумента sum
и полностью исключить n
из определения. Тот факт, что sum
не является полиморфным, позволяет избежать проблем со слабой типизацией при частичном применении.
let gauss_sum = Fun.(flip sum id)
Ваш код содержит синтаксическую ошибку из-за нежелательного
->
. Сообщение немного сбивает с толку.