tôi đọc này:ViewPatterns và nhiều cuộc gọi trong Haskell
http://hackage.haskell.org/trac/ghc/wiki/ViewPatterns
Tôi thích ý tưởng, muốn sử dụng phần mở rộng. Tuy nhiên, tôi muốn đảm bảo một điều: liệu chức năng xem có được đánh giá một lần cho một kết hợp đơn lẻ hay không.
Vì vậy, giả sử chúng ta có:
Bây giờ chúng ta hãy nói rằng tôi gọi f a
. view
được gọi hai lần hay chỉ một lần cho đối số đã cho a
?
EDIT:
tôi đã cố gắng để tìm hiểu xem đây là trường hợp và viết như sau:
{-# LANGUAGE ViewPatterns #-}
import System.IO.Unsafe
blah (ble -> Nothing) = 123
blah (ble -> Just x) = x
ble x = unsafePerformIO $ do
putStrLn $ "Inside ble: " ++ show x
return x
main :: IO()
main = do
putStrLn $ "Main: " ++ show (blah $ Just 234)
Output sử dụng GHC:
Inside ble: Just 234
Inside ble: Just 234
Main: 234
Output sử dụng GHC (với tối ưu hóa)
Inside ble: Just 234
Main: 234
Output sử dụng GHCi:
Main: Inside ble: Just 234
Inside ble: Just 234
234
GHC có một hack đặc biệt để tránh việc tính toán lại các biểu thức giống hệt nhau. – augustss