始めに
F#の文字列で色々遊んでみました
Stringモジュール関数(mapとかcollect)はいまいち使い勝手が悪いので特に取り上げていません
その代わり、文字列をリスト化して色々プログラミングしてみました
コード
module File2
//F#でに文字列を使おう!
let a = "<html>" //リテラルの宣言
printfn "%s " a //<html>が表示される
//文字列の分割
printfn "%s " a.[3..5]
//ml>が表示される
//文字列のindexの3番目から5文字目まで取る
//javaのsubstring(int,int)の挙動と同じ
//printfn "%s " a.[3..6] これは例外が発生する
//文字列のリスト化
//Stringからcharの配列に 変換する
let charlist = a.ToCharArray(0,a.Length)
//charの配列をリストに 変換する
let b = Array.toList charlist
printfn "%A" b //['<'; 'h'; 't'; 'm'; 'l'; '>']が表示される
printfn "%O" b //[<; h; t; ... ]が表示される
//パターンマッチを使ってリストの中身を標準出力へ出力する
let rec printArrayItems strs =
match strs with
|x::xs->printfn "%A" x;printArrayItems xs
|[] -> ()
//パターンマッチを使って文字列がhtmlタグかどうか判定する
//ここは単純に<>の文字列が<→>の順番で入っていればhtmlタグとする
let rec isHtmlTag strs isLtChar isGtChar =
match strs with
|x::xs->match x with
|'<' -> isHtmlTag xs true isGtChar
|'>' -> match isLtChar with
|true ->isHtmlTag xs isLtChar true
|false ->isHtmlTag xs isLtChar false
|_ -> isHtmlTag xs isLtChar isGtChar
|[] -> isLtChar && isGtChar
let a1 = ">html<"
let charlist1 = a1.ToCharArray(0,a1.Length)
let b1 = Array.toList charlist1
let a2 = "html"
let charlist2 = a2.ToCharArray(0,a2.Length)
let b2 = Array.toList charlist1
in
printArrayItems b
//'<'
//'h'
//'t'
//'m'
//'l'
//'>'
//が表示される
let r =isHtmlTag b false false
printfn "%b" r //trueが表示される
let r1 =isHtmlTag b1 false false
printfn "%b" r1 //falseが表示される
let r2 =isHtmlTag b2 false false
printfn "%b" r2 //falseが表示される
疑問点
- 文字列をリストにするスマートな方法はないものだろうか?