2013-03-01 55 views
0

如果我有像下面哈斯克爾:在同一行內調用函數多次

功能
f x = if g x /= Nothing then g x else False 

gf被調用兩次或不Haskell的「緩存」的g x初審後的結果以後可能在同一行中使用?我試圖優化一些代碼,但我不知道上述風格的函數是否像我希望的那樣計算成本高出兩倍。

在此先感謝。

+0

此外,是否發生在同一行是不相關的。它確實會影響語法,即塊開始和結束的位置(您可以始終使用'{}'來明確地寫入),但除此之外不影響任何內容。 – luqui 2013-03-02 18:21:28

回答

14

Haskell實現不記憶函數調用。

Haskell編譯器,如GHC do do common subexpression eliminiation但有一些限制。

如果有疑問,請分享結果。

f x = if g' /= Nothing then g' else False 
    where g' = g x 

但是你有一個類型錯誤,因爲g'不能同時是布爾值和Maybe。

但更好的寫法如下:

f x = case g x of 
      Nothing -> .. 
      Just _ -> .. 

計算和共享的結果只有一個分支。

+0

謝謝。這完全解釋了事情。是的,我寫這個例子函數有點倉促。 – Robincognito 2013-03-01 23:18:51

+1

你怎麼知道'g''不能既是布爾型又是'Maybe'?舉個例子,'g'可以是'read',並且原始函數會檢測到...... – kosmikus 2013-03-01 23:57:04

+4

好吧,它可能是重載'g' :)的實例。但是,如果g x/= Nothing則g x else False不會飛。 – 2013-03-02 00:02:00