Haskell函数返回重叠的元素数

时间:2012-10-08 04:57:16

标签: haskell functional-programming

如何定义一个带有两个字符串的函数,比如字符串x和字符串y,并返回第一个字符串末尾的元素数(字符串x),它与第二个字符串的开头重叠(第二个字符串) Y)。

我认为从前奏中使用isPrefixOf是一个好主意,因为它会检查字符串是否在另一个字符串中,如果是,则返回True,否则返回False。但我对如何返回多少元素重叠的计数感到有些困惑。我写了一些基于我认为你会解决问题的伪代码。

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代码。

2 个答案:

答案 0 :(得分:4)

你有完全正确的想法,但你的伪代码错过了你必须迭代传递给函数的第一个字符串的所有可能尾部的事实。

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

> countElements "board" "directors"
1
> countElements "bend" "endings"
3

答案 1 :(得分:3)

没有isPrefixOf的版本:

import Data.List

countElements xs ys = length . fst . last . filter (uncurry (==)) $ zip (reverse $ tails xs) (inits ys)