2010-09-26 69 views
10

我正在通過書The Haskell Road to Logic, Maths and Programming。 (我只是通過第一章的中途,但我很享受它,並打算繼續。)我已閱讀了第1.5節「玩Haskell遊戲」,其中「包含許多其他示例讓你熟悉[Haskell]「。到目前爲止,我已經瞭解了函數,類型聲明,守護方程,關於列表模式匹配的一些信息,以及在哪裏使用。當我調用Haskell子串函數時,爲什麼會得到「函數中的非窮舉模式」?

我堅持鍛鍊1.17,這要求我們寫一個函數子::字符串 - >字符串 - >布爾其中:

  1. 如果XS是YS的前綴,XS是的子YS
  2. 如果y S等於Y:YS'和xs是YS的一個子,XS是YS的一個子
  3. 沒有別的YS

我用中,提供的前綴功能的一個子前例:

prefix :: String -> String -> Bool 
prefix [] ys = True 
prefix (x:xs) [] = False 
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys 

,然後試圖:

substring :: String -> String -> Bool 
subsstring xs [] = False 
substring xs (y:ys) | prefix xs (y:ys) = True 
        | substring xs ys = True 
        | otherwise  = False 

...和可能的這種其他排列。

當我運行substring "abc" "xxxabcyyy"我得到True,但是當我運行substring "abc" "xxxabyyy"我得到 「*異常:substring.hs:(3,0) - (5,45):在功能子非詳盡模式」。我無法弄清楚爲什麼。我不明白在我使用「否則」時如何有非窮舉的模式。

順便說一句,該書尚未涵蓋if-then-else。現在,我寧願保留這個解決方案。

回答

12

你必須在函數名稱的拼寫錯誤:

subsstring xs [] = False 

因爲錯字的這一聲明瞭一個新的功能subsstringsubstring功能不是個例。

substring函數本身沒有任何匹配第二個參數[]的情況。

+4

我無法決定是否因爲輸入錯誤而浪費了您的時間而感到尷尬,或者很高興我的解決方案能夠正常工作,除了輸入錯誤。謝謝。 – 2010-09-26 19:20:57

+2

這很有趣。你可以有一個最複雜的類型系統,簡單的錯字不能被它捕獲。 – gawi 2010-09-26 21:24:15

+2

這就是警告。 – muhmuhten 2010-09-26 23:34:45

相關問題