ViewPatterns и множественные вызовы в Haskell

Я прочитал это:

http://hackage.haskell.org/trac/ghc/wiki/ViewPatterns

Мне нравится идея, я хочу использовать расширение. Однако я хотел бы убедиться в одном: оценивается ли функция просмотра один раз для одного соответствия.

Итак, допустим, у нас есть:

{-# LANGUAGE ViewPatterns #-}
...

f (view -> Nothing) = ...
f (view -> Just x) = ...

view :: a -> Maybe b

Теперь допустим, я вызываю f a. Вызывается ли view дважды или только один раз для данного аргумента a?

EDIT:

Я попытался выяснить, так ли это, и написал следующее:

{-# 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)

Вывод с помощью GHC:

Inside ble: Just 234
Inside ble: Just 234
Main: 234

Вывод с помощью GHC (с оптимизацией)

Inside ble: Just 234
Main: 234

Вывод с помощью GHCi:

Main: Inside ble: Just 234
Inside ble: Just 234
234

11
задан ehird 21 January 2012 в 16:57
поделиться