重要なアイデア
:
リストの回答を作成するため、||
または&&
真/偽の回答を作成するため、+
または*
数値の回答を作成するために使用します。何を組み合わせているかを考えてください。常にそうである必要はありません:
。
詳細
なぜ書けないのか聞いてみようと思います
contains xs (y:ys) = prefix xs (y:ys) : contains xs ys
:
リストの先頭に要素を接着するためのものであるため、タイプはa -> [a] -> [a]
です。これは、左側に1つ、右側にリストを配置することを意味します。再帰関数を書くときによく使用します。たとえば、次のように定義できます。
increase :: [Int] -> [Int]
increase [] = []
increase (x:xs) = x + 5 : increase xs
これx + 5
がInt
とincrease xs
です[Int]
。
あなたの関数を見てみましょう。そのタイプはcontains :: String -> String -> Bool
、文字列、次に文字列を取り、次にブール値を与えるようになっています。=
あなたが得た直後prefix xs (y:ys)
。今prefix
は同じタイプです:prefix :: String -> String -> Bool
、それで今私たちはそれを与えましたxs
、そして(y:ys)
それは私たちにブールを与えています。
行の最後にはcontains xs ys
Boolもあります。そのため、それらの間に置く:
と、次のようなものになります。
False : True
True
ただし、はリストではないため、これを行うことは許可されていません。(覚えておいてください(:) :: a -> [a] -> [a]
。)あなたはできるFalse:[True]
(そうなるでしょうが[False,True]
、とにかくそれはあなたが望むことではありません。
そこにあるかどうかを確認する必要xs
があります-前(y:ys)
または後で。またはの記号はです||
。したがって、コードは
xs
それが(y:ys)
その前にある場合( )またはそれが( )prefix xs (y:ys)
のどこかにある場合にあります。ys
contains xs ys
(前に:
置く記号)が含まれていると、
xs
それがその前にある(y:ys)
場合は(prefix xs (y:ys)
)にあり、その答えをこれらの答えの前に置きます-それはys
(contains xs ys
)のどこかにあります。
これは意味がありません。||
そのため、( )の前ではなく()が必要です:
。