2013-04-14 69 views
3

這裏是採取最後一個元素我的代碼,但是,我有不知道怎麼回事錯了,這裏是我的代碼:力圖從列表(哈斯克爾)

ll :: [a] -> a 
ll lis = case lis of 
    (_:xs) -> ll xs 
    [] -> error"xx" 

並沒有來自終端的錯誤消息: 但是當我運行「ll [1,2,3]」時,我想得到「3」,但是,我得到「*例外:xx」的結果。

誰願意告訴我它有什麼問題?謝謝XD

+0

有什麼不對的最後一個函數? http://zvon.org/other/haskell/Outputprelude/last_f.html –

+2

想到一個表達式,它會在遞歸到達空列表之前捕獲最後一個元素(在'(_:xs) - > ll xs '。 –

+0

@groovy,得到它,問題解決了,thx man XD – libra

回答

12

你永遠不會返回列表的最後一個元素。第一個case子句刪除非空列表的第一個元素,然後遞歸調用ll。最終,你會打空列表的情況下,因此錯誤得到提高。

+0

Thx用於回覆,但即使我在(_:xs)和[]之間添加了「[x] - > x」,它仍然給出相同的結果 – libra

+7

@天秤座這是因爲'(_:xs)'模式已經匹配'[x]'了,先把那個放在第一位 –

+0

lol問題解決了,thx男人XD – libra

5

我發現它有助於開始與遞歸的基本情況:

ll [x] = x 

然後遞歸:

ll (_:xs) = ll xs 

當然給人一種有用的錯誤消息的是良好的作風。這是很方便的做到這一點。最後,任何情況下,匹配時:

ll _ = error "empty list" 

作爲獎勵的WTF!?!版本:

import Data.List 

ll = foldl' (flip const) (error "empty list") 

你可以稱之爲flip const的「老年癡呆症的功能」,它只是忘記了它的第一個參數和返回第二個,並作爲foldl'挖在列表中從左至右,它會給你的最後一個元素。

+0

這很聰明!我希望我不會忘記阿爾茨海默氏症的樂趣 – zurgl

1

使用預定義功能最簡單的實現:

ll = head . reverse 
+3

或'll = last' :) – hammar