プログラミング言語 Standard ML 入門 (問題の解答例)
4.6 文字列型(eqtype string)
問 4.4
文字列に含まれる英大文字をすべて英小文字に変換する 関数 lower,および英小文字をすべて英大文字に変換する 関数 upper を定義せ よ.
解答例 以下にコード例を示す。
fun lower s = implode (map toLower (explode s)) fun upper s = implode (map toUpper (explode s))
(補足)Standard ML Basis Libraryの中のString.map関数を使えば、 より簡潔かつ効率よい以下のコードが可能。
fun lower s = String.map toLower s fun upper s = String.map toUpper s
問 4.5
第一引数で与えられた文字列が,第二引数で与えられた文字列の先頭部分文 字列になっているか否かを判定する関数isPrefix : string -> string -> boolを書け. ただし,空文字列はすべての文字列の先頭部分文字列とする.
解答例 fun isPrefix s1 s2 = s1 = substring(s2, 0, size s1)
問 4.6
advance を定義せよ.
解答例 コード例を以下にしめす。このコードは、 s1, s2, from1, from2, makIndex1, maxIndex2 が定義された環境で動作するプログラムである。
fun advance n = if from1 + n <= maxIndex1 andalso from2 + n <= maxIndex2 then if substring (s1,from1+n,1) = substring (s2,from2+n,1) then advance (n+1) else n else n
問 4.7
開始位置の s1 と s2 の大きさによる制限に注意して, nextStartPos を上記の順序関係を用いて定義し,match を完成させ よ.
解答例 コード例を以下にしめす。このコードは、 maxIndex2 が定義された環境で動作するプログラムである。
fun nextStartPos (i,j) = if j = maxIndex2 then (i+1,0) else (i,j+1)