Я бы хотел составить функции определенным образом.Пожалуйста, рассмотрите эти 2 функции в псевдокоде (не F #)
F1 = x + y
F2 = F1 * 10 // note I did not specify arguments for F1, 'reverse curry' for lack of a better word
Что я хотел бы сделать для F #, так это выяснить, что, поскольку
let F1 x y = x + y
//val F1 : int -> int -> int
код let F2 = F1 * 10
даст мнета же подпись, что и у F1: val F2 : int -> int -> int
, и вызов F2 2 3
приведет к 50: (2 + 3) * 10. Это было бы довольно умно ...
То, что происходит, совсем не так.Первая строка идет, как и ожидалось:
let F1 x y = x + y
//val F1 : int -> int -> int
, но когда я добавляю вторую строку let F2 = F1 * 10
, она отбрасывает F #.Он жалуется, что the type int does not match the type 'a -> 'b -> 'c
и что F1 теперь requires member ( + )
.
Я, конечно, мог бы изложить это так:
let F1(x, y) = x + y
let F2(x, y) = F1(x, y) * 10
Но теперь я мог бы также использовать C #, мыты уже не так далеко.Аргументированные аргументы нарушают элегантность F #.Кроме того, мои настоящие функции F1 и F2 имеют гораздо больше аргументов, чем просто 2, так что это заставляет меня идти глазами, именно то, что я хотел избежать, используя F #.Сказать это так было бы гораздо естественнее:
let F1 x y = x + y
let F2 = F1 * 10
Можно ли (почти) как-нибудь это сделать?
Для дополнительных кредитов: что именно происходит с этими сообщениями об ошибках?Почему вторая строка let F2 = F1 * 10
меняет набор текста на первой?
Заранее спасибо за ваши мысли,
Gert-Jan
update Два аплодисмента, которые (почти) делают то, что описано.
Один использует кортеж.Вторая строка выглядит немного странно, первая работает нормально.Небольшой недостаток в том, что я не могу использовать каррирование сейчас, или мне придется добавить еще более причудливый код.
let F1 (a, b) = a + b
let F2 = F1 >> (*) 10
F2(2, 3) // returns 50
Другой подход заключается в использовании записи.Это немного проще и проще на первый взгляд, но требует больше кода и церемоний.Убирает часть элегантности F #, больше похож на C #.
type Arg (a, b) =
member this.A = a
member this.B = b
let F1 (a:Arg) = a.A + a.B
let F2 (a:Arg) = F1(a) * 10
F2 (Arg(2, 3)) // returns 50