静态导致递归的Haskell函数?

时间:2019-11-28 16:51:48

标签: string haskell

我是Haskell编程的初学者,并且已获得分配以创建一个函数,该函数检查给定字符串是否是另一个字符串的子字符串,如果返回则返回子字符串在主字符串中的位置。这是我到目前为止的内容:

WITH
    a AS(
        SELECT
        date AS Date, 
        SUM(Val1 / (1 - (isnull(Val2,0.00) + isnull(Val3,0.00)))) AS Calc1
        FROM `project.dataset.table1`
        GROUP BY Date
        ),
    b as (
            SELECT
            date AS Date, 
            FROM `project.dataset.table2`
            GROUP BY Date
        )

SELECT a.Date, SUM(a.Calc1)
FULL JOIN a on b.Date = a.Date`enter code here`
GROUP BY b.Date

此分配的说明明确指出,我必须使用findString :: String -> String -> Integer findString mainstring substring | length substring > length mainstring = (-1) | take (length substring) mainstring == substring = 0 | otherwise = 1 + findString (drop 1 mainstring) substring ,并且如果子字符串不是主字符串的子字符串,则应返回findString :: String -> String -> Integer。现在,函数的递归部分通过为每个递归添加(-1)来干扰| length substring > length mainstring = (-1)的结果,但是我只想要一个静态+1。我觉得我离这里很近,但现在已经被这个卡住了一段时间。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

首先将值与otherwise = 1 + findString (drop 1 mainstring) substring进行比较,而不是仅仅进行-1。在学习材料中查找letwhere,它们会有所帮助。我认为这已经足够了。

答案 1 :(得分:1)

不要将您的想法放在类型签名上,您也可以在函数内部定义函数

findString :: String -> String -> Integer
findString mainstring substring = helper mainstring substring 0
  where 
    helper mainstring substring len
      | length substring > length mainstring = (-1)
      | take (length substring) mainstring == substring = len
      | otherwise = helper (drop 1 mainstring) substring (len + 1)