Реализовать функцию суммы Гаусса в OCaml с лямбда-выражением

Мне нужно написать функцию 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

Я не понимаю, почему возникает эта ошибка, потому что каждой левой скобке соответствует правая скобка.

Ваш код содержит синтаксическую ошибку из-за нежелательного ->. Сообщение немного сбивает с толку.

jthulhu 20.11.2022 16:07

Спасибо за ваш комментарий. Я должен работать с лямбда-выражениями. Вот почему я написал стрелки.

Zeinab Elhad 20.11.2022 16:12

Есть несколько способов ввести лямбда-выражения в OCaml, но самый простой из них — тот, который вы уже используете, с помощью fun arg -> code. Кроме того, обратите внимание, что в OCaml предусмотрен вывод типов, поэтому вам не нужно явно вводить все ваши переменные.

jthulhu 20.11.2022 16:20

Как мне тогда правильно написать лямбда-выражение?

Zeinab Elhad 20.11.2022 16:24
Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
1
4
157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переписывание с очисткой вывода типов:

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)

Другие вопросы по теме