私は本「論理学、数学、プログラミングへのハスケルの道」を読み進めています。(私は第1章の途中ですが、これまで楽しんでおり、継続するつもりです。)セクション1.5「Haskellゲームのプレイ」を読みました。 [Haskell]について知ってもらいましょう。」これまで、関数、型宣言、保護された方程式、リストパターンマッチング、およびwhere&letについて少し学びました。
私は演習1.17で立ち往生しています。この演習では、関数の部分文字列を作成するように求められます::文字列->文字列->ブール値ここで:
- xsがysのプレフィックスである場合、xsはysのサブストリングです。
- ysがy:ys'に等しく、xsがys'の部分文字列である場合、xsはysの部分文字列です。
- 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をカバーしていません。今のところ、それを自分のソリューションから除外したいと思います。