在Haskell中查找单词序列中最长的单词

时间:2013-10-14 16:23:19

标签: haskell

我应该编写一个执行标题建议的函数。但是,我正在努力解决一些错误,我无法在我的代码中找到错误。这就是我到目前为止所做的:

import Data.Char

maxWord word = maxWord_h word 0 0

maxWord_h word currVal maxx
    | word == [] = maxOf (currVal maxx)
    | isAlpha (head word) = maxWord_h ((tail word) (currVal + 1) maxx)
    | otherwise = maxWord_h (tail word) 0 (maxOf (currVal maxx))

maxOf a b
    | a > b = a
    | otherwise = b

错误:

  Couldn't match expected type `((a0 -> a0) -> a0)
                                  -> (a0 -> a0) -> [Char]'
                with actual type `[Char]'
    The function `tail' is applied to three arguments,
    but its type `[Char] -> [Char]' has only one
    In the first argument of `maxord_h', namely
      `((tail ord) (currVal + 1) maxx)'
    In the expression: maxord_h ((tail ord) (currVal + 1) maxx)

如果有人能为我指出错误并解释错误,我将非常感激。我是功能编程的初学者,所以要温和。

3 个答案:

答案 0 :(得分:1)

由于其他答案已经纠正了您的错误并使您的代码美化, 我想给你更多惯用的方法来解决你的问题。

要实际执行标题建议,您可以使用

import Data.Ord (comparing
import Data.List (maximumBy)

maxWord :: String -> String
maxWord = maximumBy (comparing length) . words

要执行代码所做的操作,您可以编写

maxLength :: String -> Int
maxLength = maximum . map length . words

我相信你的谷歌技能可以弄清楚我用过的功能。 如果没有,请随时问: - )

答案 1 :(得分:0)

删除围绕maxWord_h调用的括号,以便它:maxWord_h (tail word) (currVal + 1) maxx,或者将其移动到调用中,以便它提供:(maxWord_h (tail word) (currVal + 1) maxx)

错误是括号引入子表达式,其中你的子表达式由三个子表达式组成。在Haskell中,表达式序列与Lisp中的表达式相同;功能应用。

简而言之,您将tail word的结果作为函数应用curVal + 1maxx作为参数。

答案 2 :(得分:0)

您应该指定如何表示“单词序列”。这是一个像"a sequence of words"这样的字符串吗?或者它是像["a", "sequence", "of", "words"]

这样的单词列表

您应该为您的功能添加类型签名。这使自己和任何其他读者清楚地了解每个功能的意图。它还会稍微改进您的Haskell编译器的错误消息,因为它假定您的类型签名是正确的,而不是一些不一致的表达式,以防类型不匹配。

函数maxOf已存在,名为max

似乎currVal有时用作数字(例如(currVal + 1)),有时用作函数(例如maxOf (currVal maxx))。下定决心并在类型签名中声明真正的目的。看起来当你递归地调用maxWord_h时,你会添加一组没有意义的括号(由下面的箭头指出):

| isAlpha (head word) = maxWord_h (<-- (tail word) (currVal + 1) maxx -->)

这些括号实际上会破坏你的功能。

您应该尝试使用模式匹配而不是head / tail,因为这既是惯用又更安全。例如:

maxWord_h [] currVal maxx = max something
maxWord_h (c:rest) currVal maxx =
  if isAlpha c
    then maxWord_h rest (currVal + 1) maxx
    else maxWord_h rest 0 (max something)