Молчаливый стиль программирования с помощью F#

Это не практически важная проблема, но я хотел бы видеть пример молчаливого программирования в F#, где мои функции без точек могут иметь несколько аргументов (не в форме списка или кортежа).

И во-вторых, как такие функции могут управлять сложной структурой данных. Я испытываю его в Интерактивном F#, но еще не имею никакого успеха.

Я попробовал, например:

> (fun _ -> (fun _ -> (+))) 333 222 111 555

Тот правильный путь?

И:

> (fun _ -> (fun _ -> (+))) "a" "b" "c" "d";;  

val it : string = "cd"

6
задан Abel 6 January 2017 в 18:19
поделиться

2 ответа

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 .

4
ответ дан 17 December 2019 в 02:25
поделиться

В F # количество функций фиксировано, поэтому вы не сможете записать одновременно

(op) 1 2

и

(op) 1 2 3 4

для любого данного оператора op . Вам нужно будет использовать список или другую структуру данных, если вы этого хотите. Если вы просто пытаетесь избежать именованных переменных, вы всегда можете сделать «1 + 2 + 3 + 4». Самый идиоматический способ добавить список чисел в F # - это List.sum [1; 2; 3; 4] , который также избегает переменных.

2
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: