У меня есть следующие (простые) структуры данных:Как выглядит flatMap в структуре данных с двумя генериками?
struct Work<Input, Output> {
let work: Input -> Output
}
Этого типа представляет работу, которая может принимать Input
и превращает в в желаемом Output
. Я пытаюсь понять, соответствует ли эта структура данных некоторым функциональным концепциям, таким как функтор или монада.
Functor
extension Work {
func map<MoreOutput>(transform: Output -> MoreOutput) -> Work<Input, MoreOutput> {
return Work<Input, MoreOutput> {
return transform(self.work($0))
}
}
}
Это кажется правильным, насколько мне известно. Я могу написать функцию карты, которая может превратить Work<Input, Output>
в Work<Input, MoreOutput>
Монады
у меня есть проблема мышления определения для функции flatMap
(или fold
) для Work
. Единственное, что я могу придумать следующий:
extension Work {
func flatMap<MoreOutput>(transform: Work<Output, MoreOutput>) -> Work<Input, MoreOutput> {
return Work<Input, MoreOutput> { input in
return transform.work(self.work(input))
}
}
}
Если вы заметили flatMap
определение для Array
в стрижа это выглядит так (упрощенно):
func flatMap(transform: (Element) -> T?) -> [T]
Это функция где его аргумент является функцией, которая преобразует Element
в T
и приводит к Array
. Я не могу придумать способ абстрагирования этого типа Work
.
С другой функциональной книге я нашел общее определение flatMap следующим образом (на объект F
типа удерживания A
):
func flatMap<B>(f: A -> F<B>) -> F<B>
который представляет собой другое определение flatMap
, чем кажется Array
реализовать.
Может кто-нибудь объяснить эту разницу мне? И можно ли даже определить «правильную» функцию flatMap
на Work
? Или Work
не удовлетворяет свойствам Монады?
** Редактировать
Благодаря PHG так много полезной информации. Я пытался сделать определение Profunctor:
Изготовление Work
Profunctor
:
extension Work {
func diMap<A, B>(fa: A -> Input, fb: Output -> B) -> Work<A, B> {
return Work<A, B> { arg in
let input = fa(arg)
let output = self.work(input)
return fb(output)
}
}
}
это выглядит прямо к вам?
О, и в то время как вы на него, вы можете сделать' Work' а [profunctor] (http://haddock.stackage.org/lts -4,1/profunctors-5.1.2/Data-Profunctor.html)! – phg
Отлично, это много полезной информации! Отредактировал свой ответ, чтобы добавить мою первую попытку профессора в «Работа». –