> 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