2016-11-07 3 views
2

これも可能ですか?私は変数としてユーザーによって与えられたInt(幅)を保存するメインを持っていますが、私は他の関数の束でその変数が必要です...引数として '幅'を追加する以外にこれを行う方法はありますかすべての機能?コード全体から入力から変数にアクセスできるようにする

+0

の可能性のある重複した[ハスケル - グローバル変数(関数)をシミュレート] Rakete1111 OP @ – Rakete1111

+0

を記述する必要はありません(http://stackoverflow.com/questions/16811376/haskell-simulate-global-variablefunction)状態、読み取りのみ。 – Alec

+0

@Alecしかし、いずれにしても、Haskellの変数を変更することはできません。それにもかかわらず、OPは、ユーザーからの入力をそのOPに書き込む必要があります。 – Rakete1111

答えて

3

リーダのモナドの使い方の簡単な例を示します。

このコード:

area :: Double -> Double -> Double 
area height width = height * width 

main = do 
    width <- fmap read getLine 
    let result = area 42 width 
    print result 

は次のようになります。

import Control.Monad.Reader 

area :: MonadReader Double m => Double -> m Double 
area height = do 
    width <- ask 
    return (width * height) 

main :: IO() 
main = do 
    width <- fmap read getLine 
    let result = runReader (area 42) width 
    print result 

これは、より複雑なようだが、あなたの周りに渡すための「設定」のパラメータの多くを持っているとき、それは実際には非常にうれしいです。

import Control.Monad.Reader 

data Config = Config { width :: Double, color :: String, etc :: String } 

area :: MonadReader Config m => Double -> m Double 
area height = do 
    w <- asks width 
    return (w * height) 

main :: IO() 
main = do 
    w <- fmap read getLine 
    c <- undefined -- todo get color param 
    e <- undefined -- todo get etc param 
    let result = runReader (area 42) (Config w c e) 
    print result 
関連する問題