2013-10-14 127 views
0

我應該編寫一個功能來完成頭文件所建議的功能。然而,即時通訊掙扎着一些錯誤,我找不到我的代碼中的錯誤。這是我到目前爲止有:在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) 

我真的很感激,如果有人可以給我指出錯誤,並解釋它們。我是一個功能性編程的初學者,所以要溫柔。

+0

在'maxWord_h'中,您可以通過兩種不同的方式調用'maxWord_h'。想想看,哪一個是正確的括號? – 2013-10-14 16:32:58

+0

錯誤信息與給出的代碼不符。 –

+0

@ Code-Guru:它的確如此,它只是錯過了字母W. – 2013-10-14 16:33:30

回答

0

刪除呼叫周圍的括號爲maxWord_h,以便它給出:maxWord_h (tail word) (currVal + 1) maxx,或將它們移到呼叫周圍,以便它給出:(maxWord_h (tail word) (currVal + 1) maxx)

錯誤在於圓括號引入了子表達式,其中您的子表達式由三個子表達式組成。在Haskell中,一系列表達式意味着它與Lisp中的相同;功能應用。

總之,您應用tail word的結果作爲curVal + 1maxx作爲參數的函數。

+0

謝謝!這是問題所在。 – skrlsn

0

您應該指定如何表示「單詞序列」。這是一個像"a sequence of words"的字符串嗎?或者它是像["a", "sequence", "of", "words"]這樣的單詞列表?

你應該爲你的函數添加一個類型簽名。這讓你和任何其他讀者清楚每個功能的意圖是什麼。它還會稍微改進Has​​kell編譯器的錯誤消息,因爲它假定您的類型簽名是正確的,而不是類型不匹配的情況下某些不一致的表達式。

功能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) 
+0

謝謝!這是問題的括號。我一定會看看你的其他建議。 – skrlsn

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 

在你的谷歌的技能,我相信要弄清楚什麼我用過的功能做。 如果沒有,請隨時詢問:-)