我正在通過書The Haskell Road to Logic, Maths and Programming。 (我只是通過第一章的中途,但我很享受它,並打算繼續。)我已閱讀了第1.5節「玩Haskell遊戲」,其中「包含許多其他示例讓你熟悉[Haskell]「。到目前爲止,我已經瞭解了函數,類型聲明,守護方程,關於列表模式匹配的一些信息,以及在哪裏使用。當我調用Haskell子串函數時,爲什麼會得到「函數中的非窮舉模式」?
我堅持鍛鍊1.17,這要求我們寫一個函數子::字符串 - >字符串 - >布爾其中:
- 如果XS是YS的前綴,XS是的子YS
- 如果y S等於Y:YS'和xs是YS的一個子,XS是YS的一個子
- 沒有別的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。現在,我寧願保留這個解決方案。
我無法決定是否因爲輸入錯誤而浪費了您的時間而感到尷尬,或者很高興我的解決方案能夠正常工作,除了輸入錯誤。謝謝。 – 2010-09-26 19:20:57
這很有趣。你可以有一個最複雜的類型系統,簡單的錯字不能被它捕獲。 – gawi 2010-09-26 21:24:15
這就是警告。 – muhmuhten 2010-09-26 23:34:45