我是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
。我觉得我离这里很近,但现在已经被这个卡住了一段时间。任何帮助将不胜感激!
答案 0 :(得分:2)
首先将值与otherwise = 1 + findString (drop 1 mainstring) substring
进行比较,而不是仅仅进行-1
。在学习材料中查找let
和where
,它们会有所帮助。我认为这已经足够了。
答案 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)