10

私は本「論理学、数学、プログラミングへのハスケルの道」を読み進めています。(私は第1章の途中ですが、これまで楽しんでおり、継続するつもりです。)セクション1.5「Haskellゲームのプレイ」を読みました。 [Haskell]について知ってもらいましょう。」これまで、関数、型宣言、保護された方程式、リストパターンマッチング、およびwhere&letについて少し学びました。

私は演習1.17で立ち往生しています。この演習では、関数の部分文字列を作成するように求められます::文字列->文字列->ブール値ここで:

  1. xsがysのプレフィックスである場合、xsはysのサブストリングです。
  2. ysがy:ys'に等しく、xsがys'の部分文字列である場合、xsはysの部分文字列です。
  3. ysの部分文字列は他にありません

前の例で提供されたプレフィックス関数を使用しました。

prefix :: String -> String -> Bool
prefix [] ys = True
prefix (x:xs) [] = False
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys

そして試してみました:

substring :: String -> String -> Bool
subsstring xs [] = False
substring xs (y:ys) | prefix xs (y:ys) = True
                    | substring xs ys  = True
                    | otherwise        = False

...そしてこれの他の順列かもしれません。

実行するsubstring "abc" "xxxabcyyy"True、が表示されますが、実行するsubstring "abc" "xxxabyyy"と「***例外:substring.hs:(3,0)-(5,45):関数substringの非網羅的なパターン」が表示されます。理由がわかりません。「それ以外」を使用すると、どのように非網羅的なパターンが存在する可能性があるのか​​わかりません。

ところで、この本はまだif-then-elseをカバーしていません。今のところ、それを自分のソリューションから除外したいと思います。

4

1 に答える 1

12

関数名にタイプミスがあります:

subsstring xs [] = False

subsstringタイプミスのため、これは関数の場合ではなく、新しい関数を宣言しsubstringます。

そのsubstring場合、関数自体には、の2番目のパラメーターに一致するケースはありません[]

于 2010-09-26T19:11:53.903 に答える