作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试计算不包括空格的字符串长度。我不能使用 length、filter 和 if-else。只有递归。我当前的代码是:
countLetters :: String -> Int
countLetters "" = 0
countLetters str = 1+ countLetters(tail str)
我尝试做的事情,
countLetters :: String -> Int
countLetters "" = 0
countLetters (" ",xs) = 0 + countLetters(xs)
countLetters str = 1+ countLetters(tail str)
但我得到的是:
Couldn't match type `([Char], String)' with `[Char]'
Expected type: String
Actual type: ([Char], String)
In the pattern: (" ", xs)
In an equation for `countLetters':
countLetters (" ", xs) = 0 + countLetters (xs)
我还尝试删除额外的归纳步骤并枚举条件,
fromEnum head str!=" "
因此,如果字符串的开头是空格,则该值将为 1,但 != 不是有效的运算符。即使 == 也会产生,
head str == " "
<interactive>:22:13: error:
* Couldn't match expected type `Char' with actual type `[Char]'
* In the second argument of `(==)', namely `" "'
In the expression: head str == " "
In an equation for `it': it = head str == " "
所以请帮我找到另一种方法。
最佳答案
你在这里犯了两个错误。首先,列表的“缺点”使用 (:)
作为数据构造函数,因此您使用 ("":xs)
,而不是 ("",xs)
。
此外,String
是 Char
的列表,因此这意味着元素是 Char
,而不是 String
,因此您应该使用 ' '
,而不是 :""
countLetters :: String -> Int
countLetters "" = 0
countLetters <b>(' ':xs)</b> = countLetters xs
countLetters str = 1 + countLetters (tail str)
通常,使用模式匹配比使用 head
和 tail
更好,因为 tail
会引发空的错误列表,通过使用模式匹配,我们知道列表不为空:
countLetters :: String -> Int
countLetters "" = 0
countLetters <b>(x:xs)</b>
| <b>x == ' '</b> = countLetters <b>xs</b>
| otherwise = 1 + countLetters <b>xs</b>
关于haskell - 在 haskell 函数的归纳步骤中检查字符串中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66751810/
我一直在阅读Practical Foundations for Programming Languages并发现迭代和同时归纳定义很有趣。我能够很容易地对偶函数和奇函数的相互递归版本进行编码 onli
我是一名优秀的程序员,十分优秀!