OCaml: отображение списка функции с 2 входами - PullRequest
2 голосов
/ 29 августа 2011

У меня есть функция sqrt, которая принимает 2 значения с плавающей запятой, допуск и число и выдает квадратный корень из числа в пределах указанного допуска.Для этого я использую метод приближения.

let rec sqrt_rec approx tol number =
..................;;
let sqrt tol x = sqrt_rec (x/.2.0) tol x;;

У меня есть еще одна карта функций, которая берет функцию и список и применяет эту функцию ко всем элементам списка.

let rec map f l = 
match l with
[] -> []
| h::t -> f h::map f t;;

Теперь я пытаюсь создать еще одну функцию all_sqrt, которая в основном принимает 1 значение с плавающей запятой, 1 список с плавающей запятой и отображает функцию sqrt на все элементы.Я попытался сделать tol_value также списком, но он все равно выдает ошибку.Ошибка: эта функция применяется к слишком многим аргументам;может быть, вы забыли `; '

Я полагаю, что я неправильно делаю отображение.

Ответы [ 3 ]

7 голосов
/ 29 августа 2011

Модуль List содержит

val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list

который используется так:

let all_sqrt tol_value ip_list = List.map2 sqrt tol_value ip_list
1 голос
/ 29 августа 2011

Это звучит как домашнее задание, поскольку вы говорите, что ограничены определенными функциями в своем решении.Поэтому я постараюсь дать только некоторые предложения, а не ответ.

Вы хотите использовать одинаковый допуск для всех значений в вашем списке.Представьте, есть ли способ объединить допуск с вашей функцией sqrt для создания новой функции, которая принимает только один параметр.У вас есть что-то типа float -> float -> float, и вы как-то хотите использовать только первый float.Это вернет вам функцию типа float -> float.(Как отметил Уэс, это работает, потому что ваша функция sqrt определена в форме Curried.)

Все, что я могу сказать, - это то, что языки FP, такие как OCaml (и Haskell), исключительно хороши в этом.На самом деле, это трудно , а не делать это, пока вы помните о приоритетах различных вещей.(То есть подумайте о скобках.)

0 голосов
/ 29 августа 2011

Я не знаю O'Caml, но я знаю Haskell, и мне кажется, что вы применяете map к 3 аргументам. "Sqrt tol_value ip_list" map принимает только два аргумента и имеет тип ('a ->' b) -> 'список ->' список b , что означает, что он принимает функцию (функции принимают только один вход и возвращает один выход), а также список и возвращает новый список.

http://en.wikipedia.org/wiki/Currying

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...