2017-10-02 12 views
0

現在SML関数の言語を学習しています。文字のリストを取得し、それが白いスペースを見つけるとリスト内の空白を検索する関数を作成しようとしています空白の前にある文字は、空白で区切られた文字で構成される文字列のリストを返します。単語のリストに文字のリストを分割する

ここに私のコードですが、何か問題があります。コンパイラはeofにエラーがあると言います!

fun sepWords ([]) = [] 
    | sepWords (x :: xs) = 
    let 
     val word = "" 
     val list 
     sepWords (xs) 
    in 
     if (Char.isSpace (x)) then (word = "") 
     else (word^x) 
     word :: list 
    end; 

答えて

0
  1. あなたはラインval listsepWords (xs)の周りに構文エラーがあります。おそらく、あなたはval list = sepWords (xs)を書くことを意図しましたか?また、if ...word :: listの前後に構文エラーがあります。私はここに何が意図されているのかよく分かりませんが、word :: listは '単語'を 'リスト'に追加するという副作用があると思いますか? 「その後、」枝がブールを入力していると「それ以外」の枝がタイプ文字列を持つ式word^xを持つ式word = ""を持っているので

  2. はあなたのif ...における型エラーを持っています。 if-then-elseは、タイプ・チェッカーがプログラムを受け入れるために、各ブランチに同じタイプを持たなければなりません。 >文字列リスト - タイプ文字列で関数を作らない理由>文字列リスト、 -

  3. 代わりの種類 char型のリストを持つ関数を作りますか?その場合、文字列文字リストに変換する中間ステップを避けることもできます。これは、文字インデックスを元の文字列にトラッキングすることです(たとえば、サブ文字列タイプを使用して)。

    この関数の名前は「単語」にすることができます。

  4. 複数の空白が連続して発生する場合の動作を定義していません。 words "hello world"["hello", "world"]または["hello", "", "world"]を生産しますか?

  5. は、実際には、内蔵でこれを行うライブラリ関数があります。

    - String.tokens Char.isSpace "hello world"; 
    > val it = ["hello", "world"] : string list 
    
    - String.fields Char.isSpace "hello world"; 
    > val it = ["hello", "", "world"] : string list 
    
  6. 最初char型のリストにご文字列変換の選択肢があっても、リストの再帰の微細な運動であります戦略はあまり効率的ではありません。

    fun firstWord [] = ([], []) 
        | firstWord (c::cs) = 
        if Char.isSpace c 
        then ([], cs) (* throw away the space c *) 
        else case firstWord cs of 
          (fw, remainder) => (c::fw, remainder) 
    

    あなたはこのように呼び出すことができます:あなたは、文字列の残りの部分と一緒に、あなたの入力から単一の単語を抽出する問題を解決することによって、この取り掛かることができ

    - firstWord (explode "hello world"); 
    > val it = 
        ([#"h", #"e", #"l", #"l", #"o"], [#" ", #"w", #"o", #"r", #"l", #"d"]) 
         : char list * char list 
    

    を、あなたはそれを呼び出すことができます再帰的に限り、残りが空でないよう:

    fun words [] = [] 
        | words cs = 
        let val (fw, remainder) = firstWord cs 
        in implode fw :: words remainder end 
    

    そして、これを使用して:

    - allWords (explode "hello world"); 
    > val it = ["hello", "", "world"] : string list 
    
+0

ありがとうございました。あなたの答えは私の問題を解決するだけでなく、私が気づいていなかったことを教えてくれました。あなたは最高です ! – xx3z

関連する問題