输入:包含大量单词的字符串.例如:“我是一个年轻人,我有一个大房子.”
结果将是5,因为文本中最长的单词有5个字母(年轻和房子).
我刚刚开始学习Haskell.我试过了:
import Charimport Listmaxord' (str:strs) m n = if isAlpha str == True then maxord'(strs m+1 n)else if m >= n then maxord'(strs 0 m) else maxord'(strs 0 n)maxord (str:strs) = maxord' (str:strs) 0 0
我想返回n作为结果,但我不知道该怎么做,似乎代码也有问题.
有帮助吗?谢谢
解决方法 这里有几个问题.让我们从语法开始.您的其他部分应缩进与它们所属的相同或更多,例如,如下所示:
if ...then ...else if ... then ... else ...
接下来,您的功能应用程序与许多其他语言不同,在Haskell中,括号仅用于分组和元组.由于函数应用程序在Haskell中如此常见,我们使用最轻量级的语法,即空格.因此,要将函数maxord’应用于参数strs,m 1和n,我们将写入maxord’strs(m 1)n.请注意,由于函数应用程序具有最高优先级,我们必须在m 1附近添加括号,否则它将被解释为(maxord’strs m)(1 n).
这就是语法.下一个问题是语义问题,即你有没有基本情况的递归.使用模式(str:strs),您已经指定了在剩下一些字符时要执行的 *** 作,但是当您到达字符串末尾时没有指定要执行的 *** 作.在这种情况下,我们想要返回n,所以我们为此添加一个案例.
maxord' [] m n = n
因此,固定的maxord’
maxord' [] m n = nmaxord' (str:strs) m n = if isAlpha str == True then maxord' strs (m+1) n else if m >= n then maxord' strs 0 m else maxord' strs 0 n
但请注意,此解决方案并不是非常惯用.它使用显式递归,如果表达式而不是保护,将布尔值与True进行比较,并且具有非常迫切的感觉.一个更惯用的解决方案就是这样.
maxord = maximum . map length . words
这是一个简单的函数链,其中单词将输入分成单词列表,映射长度用其长度替换每个单词,最大值返回这些长度的最大值.
虽然,请注意它与您的代码不完全相同,因为在分割输入时,单词function使用稍微不同的标准.
总结以上是内存溢出为你收集整理的Haskell – 找到文本中最长的单词全部内容,希望文章能够帮你解决Haskell – 找到文本中最长的单词所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)