[Swift]関数式プログラミングで文字列のRangesを使用


原文:Swift:Using String Ranges The Functional Way
数週間前に『SwiftでRangeを使って文字列を切り取る方法』を紹介しました.その時、SwiftでRangeを使うのはなぜこんなに難しいのか疑問に思っていましたが、少なくとも仕事ができる使い方を見つけました.
しかし、ここ数週間、多くの関数プログラミングの知識を学んだ後、SwiftのRangeがこんなに難しいのは、より具体的には関数プログラミングに似た方法で使用するように導くためであることに気づいた.
edX FP 101 xコースを見ることで、私が学んだ最初の知識はheadとtailの概念です.実際、最初の授業ではheadとtailの概念を紹介するのに5分もかかり、その後の授業でもこの2つの概念に言及されてきた.概念自体は非常に簡単です.headはlistの最初の要素であり、tailはlistの最初の要素以外の要素からなるlistです.
head[1,2,3,4,5]
// 1
 
tail[1,2,3,4,5]
// [2,3,4,5]

関数式プログラミングでは,古典的なforループを用いて問題を処理することは少なく,代わりにhead,tail,再帰的な方法を用いてlist中の要素の操作を処理する.
次に、単語の前のxビットの文字を取得する具体的な例を見てみましょう.SwiftのRangesを使用することを考慮しないと(確かに使いにくいので)、次のように実現する可能性があります.
func getSubstringUpToIndex(index: Int,
    fromString str: String) -> String
{
    var substring = ""
     
    for (i, letter) in enumerate(str) {
         
        substring.append(letter)
         
        if i == index - 1 {
            break
        }
    }
     
    return substring
}
 
getSubstringUpToIndex(5, fromString: "Hello, NatashaTheRobot")
// Hello

関数プログラミングの考え方を見てみましょう.head、tail、再帰を使用してどのように実現しますか.
func getSubstringUpToIndex(index: Int,
    fromString str: String) -> String
{
    let (head, tail) = (str[str.startIndex], dropFirst(str))
     
    if index == 1 {
        return String(head)
    }
     
    return String(head) +
        getSubstringUpToIndex(index - 1, fromString: tail)
}
 
getSubstringUpToIndex(5, fromString: "Hello, NatashaTheRobot")
// Hello

上記の例を見て、Swiftがなぜこんなに使いにくいRanges、startIndex、endIndexを設計したのか、いくつかの自分の認識があると思います.
上記の例では、私が『SwiftでRangeカット文字列をどのように使うか』で説明した方法も使用できますが、上述した関数式のソリューションを採用することで、forループのソリューションに取って代わって、関数式のプログラミングをどのように使うかをより多く考えることができます.結局、このような関心の頭と尾の方式(同時にもっと簡単な方法で問題を解決することはありません)は多くのSwiftのAPIで体現されています.