4

プログラムに問題があり、問題を特定することができました。私はそれをこのより単純な問題に減らすことができました。私が機能を持っているとしましょう

fn:: String -> String
fn (x:xs)
    | null (x:xs) = "empty"
    | otherwise = "hello"

ランダムなものを入力すると戻ります"hello"が、そうすると、

fn ""

非網羅的なパターンエラーが発生します。「」は空のリストであると想定されているので[]、最初のパターンと一致して返されるべきではありません"empty"か?

4

2 に答える 2

11

HaskellのAStringは文字のリストです。したがって、空Stringを一致させるには、空のリスト()を一致させる必要があります[]。パターンは、1つの要素( )と残りの要素()で構成されており、空または空でない可能性があるため、少なくとも1つの要素を持つ(x:xs)リストまたはsにのみ一致します。Stringxxs

関数の動作バージョンは次のようになります。

fn :: String -> String
fn [] = "empty"
fn (x:xs) = "hello"

これはに戻り"empty"ますfn ""

于 2012-07-14T20:17:07.903 に答える
8

あなたの機能

fn:: String -> String
fn (x:xs)
    | null (x:xs) = "empty"
    | otherwise = "hello"

次のように書く方がよいでしょう:

fn :: String -> String
fn x | null x    = "empty"
     | otherwise = "hello"

また

fn :: String -> String
fn "" = "empty"
fn _  = "hello"

null (x:xs)確かに間違っているので(常にFalse)。

文字列タイプのみを気にすることが明らかになるので、後者の方が好きです。

ただし、これは少し奇妙な関数です。私は実際にそれを見たことがありません。

于 2012-07-14T23:08:52.717 に答える