Это не практически важная проблема, но я хотел бы видеть пример молчаливого программирования в F#, где мои функции без точек могут иметь несколько аргументов (не в форме списка или кортежа).
И во-вторых, как такие функции могут управлять сложной структурой данных. Я испытываю его в Интерактивном F#, но еще не имею никакого успеха.
Я попробовал, например:
> (fun _ -> (fun _ -> (+))) 333 222 111 555
Тот правильный путь?
И:
> (fun _ -> (fun _ -> (+))) "a" "b" "c" "d";;
val it : string = "cd"
F # не содержит некоторых основных функций, доступных в Haskell. (в основном потому, что программисты на F # обычно предпочитают явный стиль программирования и используют безточечный стиль только в самых очевидных случаях, когда это не ухудшает читабельность).
Однако вы можете определить несколько базовых комбинаторов, например:
// turns curried function into non-curried function and back
let curry f (a, b) = f a b
let uncurry f a b = f (a, b)
// applies the function to the first/second element of a tuple
let first f (a, b) = (f a, b)
let second f (a, b) = (a, f b)
Теперь вы можете реализовать функцию для сложения длин двух строк с помощью комбинаторов следующим образом:
let addLengths =
uncurry (( (first String.length) >> (second String.length) ) >> (curry (+)))
Это создает две функции, которые применяют String.length
к первому / второму элементу кортежа, затем составляет их, а затем добавляет элементы кортежа, используя +
. Все это заключено в uncurry
, поэтому вы получаете функцию типа строка -> строка -> int
.
В F # количество функций фиксировано, поэтому вы не сможете записать одновременно
(op) 1 2
и
(op) 1 2 3 4
для любого данного оператора op
. Вам нужно будет использовать список или другую структуру данных, если вы этого хотите. Если вы просто пытаетесь избежать именованных переменных, вы всегда можете сделать «1 + 2 + 3 + 4». Самый идиоматический способ добавить список чисел в F # - это List.sum [1; 2; 3; 4]
, который также избегает переменных.