challenge 変数の初期値

WEB+DB 43のRecent Perl Worldを読んで知りました。

変数を初期化するに当たってPerlでは
my $var ||= 'foo';
とかきます。この不備を補うためPerlの5.10には
Defined-or演算子が実装されたそうです。
$zero //= 25;
このような変数のデフォルト設定を行う方法を各種言語ではどうかくのでしょうか。


Posted feedbacks - Haskell

お題は変数の「デフォルト値」をセットするコードなので、「デフォルト値」以外をセットできないHaskellでは普通にイニシャライズすればオッケイ?

それとは別に、スレッド間通信用のMVar型はnewEmptyMVarでもって、値のセットされていないインスタンスを手に入れられるので、MVarでやってみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
module Main
    where

import Control.Concurrent
import Control.Monad

uninitedMVar :: IO (MVar Int)
uninitedMVar = newEmptyMVar

initedMVar :: IO (MVar Int)
initedMVar = newMVar 4

setIfEmpty :: MVar Int -> Int -> IO ()
setIfEmpty em i = do
    fEmpty <- isEmptyMVar em
    if (fEmpty) then
        tryPutMVar em i >> return ()
        else
            return ()

setAndPrint :: MVar Int -> IO()
setAndPrint em = do
    setIfEmpty em 7
    i <- takeMVar em
    putStrLn $ show i

i = 4

main = do
    print i
    uninitedMVar >>= setAndPrint
    initedMVar >>= setAndPrint
==>
4
7
4

if文きらいです...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module Main
    where

import Control.Concurrent
import Control.Monad

uninitedMVar :: IO (MVar Int)
uninitedMVar = newEmptyMVar

initedMVar :: IO (MVar Int)
initedMVar = newMVar 4

setIfEmpty :: MVar Int -> Int -> IO ()
setIfEmpty em i = isEmptyMVar em >>= \fEmpty -> when (fEmpty) $ putMVar em i

setAndPrint :: MVar Int -> IO()
setAndPrint em = do
    setIfEmpty em 7
    takeMVar em >>= putStrLn.show

i = 4 --immutable

main = do
    print i
    uninitedMVar >>= setAndPrint
    initedMVar >>= setAndPrint

Index

Feed

Other

Link

Pathtraq

loading...