Cleanの文字列型は微妙

Cleanの文字列は[Char]じゃなく{#Char}という型になっているため,通常のリストとして扱えません.
配列は動的に長さが変えられないので,前回のエントリのような,シーケンスを頻繁に切り貼りしたいケースだと不便です.
内包表記は使用できますが,(リストのような)パターンマッチが行えません.

不便な例

  // これは出来ない><
  f :: String -> String
  f {c:cs} = "hoge"
  f {}     = "empty"

配列操作の例

配列には専用のセレクタ構文が定義されており, 以下のように使用します.

  g a=:{[0]=c} = {a & [0] = toUpper c} // 1文字目を大文字にする
  
  g "hoge" // "Hoge"
  g "" // Run Time Error: index out of range

配列型

配列は基本的にパフォーマンスのために使用します.
リストと違って長さの変更が出来ず,配列の長さはプログラマが保証する必要があります.
範囲外の添え字でアクセスすると上の例のようにランタイムエラーとなります.

Cleanの文字列型は以下のように定義されています.

 :: String :== {#Char}

{Hoge}はHoge型の配列を表します.
#(シャープ)はUnboxedという性質(?)を表し、これは配列の各要素がメモリ上に直接格納されることを表しています.
以下にC言語との対比を示してみます.

名称 Cleanでの表現 (だいたい対応する)C言語での表現
遅延配列 {Int} int const * const x[]
正格配列 {!Int} int const * const x[]
Unboxed配列 {#Int} int const x[]

Unboxed属性は組み込み型の配列にのみ付与することが出来ます.
こういった細かいところで速さを稼いでるワケですねー.