0

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

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)

如果有人能为我指出错误并解释它们,我将不胜感激。我是函数式编程的初学者,所以要温柔。

4

3 回答 3

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

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

于 2013-10-15T10:27:21.317 回答
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)
于 2013-10-14T16:55:28.563 回答
0

删除调用 to 周围的括号maxWord_h,使其给出 this: maxWord_h (tail word) (currVal + 1) maxx,或将它们移动到调用周围,使其给出 this: (maxWord_h (tail word) (currVal + 1) maxx)

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

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

于 2013-10-14T16:49:04.693 回答