プログラミング言語 Standard ML 入門 (問題の解答例)
4 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

開始位置の s1s2 の大きさによる制限に注意して, nextStartPos を上記の順序関係を用いて定義し,match を完成させ よ.

解答例  コード例を以下にしめす。このコードは、 maxIndex2 が定義された環境で動作するプログラムである。

   fun nextStartPos (i,j) = if j = maxIndex2 then (i+1,0) else (i,j+1)