Я читал это:
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
?
ИЗМЕНИТЬ:
Я попытался выяснить, так ли это, и написал следующее:
{-# 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