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)
如果有人能为我指出错误并解释错误,我将非常感激。我是功能编程的初学者,所以要温和。
答案 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 + 1
和maxx
作为参数。
答案 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)