F # Функциональное программирование - PullRequest
0 голосов
/ 02 февраля 2020
  1. Определите функцию add10, которая принимает целочисленный аргумент, добавляет к нему 10 и возвращает результат.

  2. Определяет функцию add20, который использует add10, чтобы добавить 20 к данному целому числу. (add20 не разрешается использовать «+».)

Я не уверен, если я слишком много думаю об этом, и есть более простое решение, как просто добавление другой функции, которую он не спрашивает, так как он не уточнил, могу ли я или не могу, а нужно только использовать функции add10 и add20, но я не могу понять, как добавить 20 без знака добавления к результату add10.

Всякий раз, когда я использую только функцию add20, это только любое целое число, следующее за ним в 2.

Код и вывод следующим образом:

> let add10 x = x + 10;;
val add10 : x:int -> int

> add10 2;;
val it : int = 12

> let add20 add10 = add10 * 2;;
val add20 : add10:int -> int

> add20 3;;
val it : int = 6

> let j = 2 |> add10 |> add20;;
val j : int = 24

1 Ответ

3 голосов
/ 02 февраля 2020
> let add20 add10 = add10 * 2;;

В этом объявлении вы говорите, что add20 - это функция, которая принимает параметр с именем add10 и возвращает значение add10 * 2. Если вы использовали другое имя для параметра, возможно, было бы более понятно, что эта функция просто умножает свой аргумент на 2:

> let add20 x = x * 2;;
> add20 33;;
val it : int = 66

Тот факт, что параметр назван add10, не означает, что вы используете функция add10 с тем же именем; обратите внимание на сигнатуру типа add20 : add10:int -> int, что параметр add10, как ожидается, будет int, а не функцией.

Вы, кажется, пришли с базовой c идеей о том, как решить эта проблема заключается в том, что функция add20 должна работать, выполнив add10 дважды. Проблема в том, что add10 * 2 не означает "выполнить функцию add10 дважды" , это означает ", умножьте число add10 на 2" , что не то, что вы предназначен.


Что вы действительно хотите сделать, это дважды вызвать функцию , где выход первого вызова используется как вход для второго вызова. Кажется, вы уже знаете о трубе вперед оператора |>, поэтому вы можете использовать это:

> let add20 x = x |> add10 |> add10;;
> add20 33;;
val it : int = 53

Или, если вы посмотрите на это по-другому, вам нужно возьмите add10 и составьте с собой, чтобы определить новую функцию. Если вы знакомы с оператором композиции оператор >>, вы можете написать:

> let add20 = add10 >> add10;;
> add20 55;;
val it : int = 75
...