Swift中的功能性思维?

Sin*_*rpa 1 haskell functional-programming swift

我开始学习Haskell和Swift.我想知道这是否是以"功能"方式思考的正确方法?问题是创建卡片组:我需要穿过套装和排名 - 为每件套装创建具有给定套装和等级的卡片.它以"势在必行"的方式:

let suits: Array<Character> = ...
let ranks: Array<Int> = ...

var cards: [Card]
for suit in suits {
    for rank in ranks {
        cards.addObject(Card(suit: suit, rank: rank))
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用递归的纯函数,它可以工作但是,它可以用更少的代码完成吗?对我来说,Swift中的"功能"不太可读,或者说我做错了......

let cards = cardsWithSuits(suits, ranks, [Card]());

func cardsWithSuits(suits: [Character], ranks: [Int], cards: [Card]) -> [Card] {
   if suits.count == 0 { return cards }
   let suit: Character = head(suits)!
   let acc = cardsWithRanks(ranks, suit, cards)

   return cardsWithSuits(drop(1, suits), ranks, acc)
}

func cardsWithRanks(ranks: [Int], suit: Character, cards: [Card]) -> [Card] {
   if ranks.count == 0 { return cards }
   let acc = cards + [Card(suit: suit, rank: head(ranks)!)]

   return cardsWithRanks(drop(1, ranks), suit, acc)
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*rry 5

建立在Haskell的应用性概念的使用,并<$><*>您可能会发现下面的通常是有用的(我想我已经翻译正确,但它是基于阵列不能序列):

// use <^> because <$> is already used
infix operator <^> { associativity left }
public func <^> <T, U>(left:(T)->U, right:[T]) -> [U] {
    return map(right) { return left($0) }
}

public func flatten<T>(input:[[T]]) -> [T] {
    return input.reduce([], +)
}

infix operator <*> { associativity left }
public func <*> <T, U>(left:[(T)->U], right:[T]) -> [U] {
    return flatten(map(left) { (function) -> [U] in
        return map(right) { return function($0) }
    })
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下内容:

let suits : [Character] = [ "C", "D", "H", "S"]
let ranks = Array(2...14)

struct Card {
    let suit : Character
    let rank : Int

    static func build(suit:Character)(rank:Int) -> Card {
        return Card(suit: suit, rank:rank)
    }
}

Card.build <^> suits <*> ranks
Run Code Online (Sandbox Code Playgroud)