1

2 つの文字列 (文字列 x と文字列 y など) を受け取り、最初の文字列 (文字列 x) の末尾にある要素の数を返し、2 番目の文字列 (2 番目の y) の先頭と重複する関数を定義するにはどうすればよいでしょうか。

文字列が別の文字列にあるかどうかをチェックし、そうでない場合は True を返し、そうでない場合は False を返すため、プレリュードの isPrefixOf を使用してこれを行うことをお勧めします。しかし、重複する要素の数のカウントを返す方法に少し混乱しています。あなたが問題にどのようにアプローチすると思うかに基づいて、いくつかの疑似コードを書きました。

countElements :: Eq a => (Str a, Str a) -> Int
countElements (x,y) = 
     if x `isPrefixOf` y == True
         then return the count of how many elements overlap
     otherwise 0

サンプル出力は次のようになります。

countElements (board, directors) = 1
countElements (bend, ending) = 3

ここで何か助けはありますか?私は Haskell コードを書くのが苦手です。

4

2 に答える 2

4

あなたは正確に正しい考えを持っていますが、あなたの擬似コードは、関数に渡された最初の文字列の可能なすべてのテールを反復しなければならないという事実を見逃しています。

countElements :: String -> String -> Int
countElements s t = length $ head $ filter (`isPrefixOf` t) (tails s)

> countElements "board" "directors"
1
> countElements "bend" "endings"
3
于 2012-10-08T05:40:09.060 に答える
3

なしのバージョンisPrefixOf

import Data.List

countElements xs ys = length . fst . last . filter (uncurry (==)) $ zip (reverse $ tails xs) (inits ys)
于 2012-10-08T07:21:28.867 に答える