3

Я вижу, что Swift предлагает удобный синтаксис для объявления карриных функций. В руководстве представлено приложение с частичной функцией, в качестве примера того, где будет использоваться функция в карри.Каков полезный пример приложения частичной функции в Swift?

Может ли кто-нибудь дать мне пример, где приложение частичной функции может быть полезно? Я знаю, что это концепция общего функционального программирования, но пример в Swift был бы наиболее ценным.

+0

Наиболее часто используется для повторного запроса контейнер некоторых Сортировать. Примените функцию поиска к контейнеру, назовите это значение, и вы сможете повторно применять его немного дешевле. –

ответ

5

Предположим, вы часто хотите проверить номер, i, является кратным другому значению. Что может быть несколько из может измениться, но правило для определения его всегда одно и то же: i % n == 0.

Вы могли бы написать такую ​​функцию:

func isMultipleOf(#n: Int, #i: Int) -> Bool { 
    return i % n == 0 
} 

isMultipleOf(n: 2, i: 3) // false 
isMultipleOf(n: 2, i: 4) // true 

Однако, возможно, вы оказываетесь часто хотят использовать эту функцию с другими функциями «высокого порядка» - то есть, функции, которые принимают другие функции в качестве аргументов , такие как map и filter:

let r = 1...10 
// use isMultipleOf to filter out the even numbers 
let evens = filter(r) { isMultipleOf(n: 2, i: $0) } 
// evens is now [2,4,6,8,10] 

Это использование isMultipleOf выглядит немного неуклюжим и трудно читать, поэтому, возможно, вы определить новую функцию, isEven, с точки зрения isMultipleOf, чтобы сделать его немного яснее:

let isEven = { isMultipleOf(n: 2, i: $0) } 
isEven(2) // true 
isEven(3) // false 
let evens = filter(r, isEven) 

Теперь предположим, что вы объявляете isMultipleOf немного по-другому, как выделанной функции:

func isMultipleOf(#n: Int)(#i: Int) -> Bool { 
    return i % n == 0 
} 

isMultipleOf теперь функция, которая принимает число, n и возвращает новую функцию, которая принимает число и проверяет, является ли она кратной n.

Теперь вы можете использовать его, чтобы объявить isEven как это:

let isEven = isMultipleOf(n: 2) 

Или вы можете использовать его непосредственно с фильтром, как это:

let evens = filter(r, isMultipleOf(n: 2)) 
// just like before, evens is [2,4,6,8,10] 
+0

Это выглядит убедительно. –