まず、あなたのタイプシグネチャは完全に台無しです。それは存在しないか、またはspanString :: <some type>
の形式でなければなりません。もし我々が二重コロンの前に立っている(c, [s])
を無視しても、残りはまだ変わったものです。これは、「(c, [s])
の値を任意のcおよびsのタイプ[]
の値に変換する関数」(cおよびsは型変数)として読み取ることができます。まず、Haskellにタイプ[]
はありません。要素タイプのないリストタイプはありません。次に、c
とs
で作業することはできません。我々はそれらを比較することができなければなりません、そうですか?
実際には多型を使用しないようにして、必要なタイプを正確に指定しましょう。何らかの理由でタプルに詰め込まれた文字と文字のリストが必要です:(Char, [Char])
Char
は大文字で始まります。つまり、型変数ではなく、具体的な型です。結果のタイプはどうですか?問題の説明を信頼する場合は、文字リスト([Char]
)を返す必要がありますが、コードを見ると明らかにリストのタプル(([Char], [Char])
)が返されます。さて、2番目のリストが役に立つかもしれませんが、今のままにしましょう:
spanString :: (Char, [Char]) -> ([Char], [Char])`
コードがコンパイルされました。
ただし、実行すると、例外:Non-exhaustive patterns in function spanString
が発生してクラッシュします。これは、渡されたリストが空の場合には処理しないためです。あなたがそれを行う場合は、
spanString (_, []) = ([], [])
のような式を追加することによって、あなたの機能がうまく動作しますが、今のは、それが何をするかを見てみましょう。リスト分割のための関数があることがわかります:タプルの最初の要素としてc
より小さい指定された文字列のすべての文字を返し、2番目の要素として他のすべての文字を返します。バグのようです(あなたは全く異なる機能を実装しました!)。
引数の型がタプルであっても?なぜなら、charとlistを持つタプルを渡すはずだからです。 – Mike
@Mike:その場合は問題ありません。 'spanString ::(Char、String) - > String'がありますが、それはむしろハスケルではありません。 – ivanm