Haskellの正格評価と遅延評価について実験してみた

2019-04-27 programming Haskell

遅延評価はどこまで遅延されるのかよく分かってなかったので, いくつか実験をしてみました.

次のコードは問題なく動き, 実行結果は3です. タプルの第二要素は評価されなかったということですね.

main = print $ fst $ (3, undefined)

同様に以下も動きます.

data Human = Human
    { name :: String
    , age  :: Int
    } deriving(Show)

main :: IO ()
main = do
    let h = Human undefined 3
    print $ age h

パターンマッチもOKです.

data Human = Human
    { name :: String
    , age  :: Int
    } deriving(Show)

main :: IO ()
main = do
    let Human x y = Human undefined 3
    print y

ネストしていてもOKです. FullNameは各フィールドが正格評価ですが, Human自体はnameundefinedでも問題ありません.

data Human = Human
    { name :: FullName
    , age  :: Int
    } deriving(Show)

data FullName = FullName
    { first  :: !String
    , second :: !String
    } deriving(Show)

main :: IO ()
main = do
    let h = Human undefined 3
    print $ age h