unsafePerformIO $ entryGetText myTextEntry
のようなキーボード入力があります。この値を「定数」のように保存するにはどうすればいいですか(データタイプはプログラム開始後のHaskellの "定数"
)です。
valuea::Int
valuea = 120
しかし、値がユーザーによって定義されていない場合、このメソッドは単に、動作します。私は、「変数を救う」ために知っている唯一の方法があります。事前に
おかげ
unsafePerformIO $ entryGetText myTextEntry
のようなキーボード入力があります。この値を「定数」のように保存するにはどうすればいいですか(データタイプはプログラム開始後のHaskellの "定数"
)です。
valuea::Int
valuea = 120
しかし、値がユーザーによって定義されていない場合、このメソッドは単に、動作します。私は、「変数を救う」ために知っている唯一の方法があります。事前に
おかげ
unsafePerformIO
should be avoided at all costs、その実行が予測不可能であるとして。
ハスケルは純粋な言語であり、値は不変であるため、他の場所で突然変異したとして表示される値を「保存」することはできません。
代わりに、値を読み込み、必要に応じて値を渡す必要があります。
main = do
putStrLn "Enter the default massSaved value"
val <- getLine
doThingsWithDefaultSimuInfo (Information (read val :: Double))
doThingsWithDefaultSimuInfo :: SimuInfo -> IO()
doThingsWithDefaultSimuInfo si = do
...
(そこ読者でこれを行うには、よりクリーンで慣用的な方法があるが、私は初心者レベルを目的としたこの答えを維持しようとしている)、ユーザから入力された
値ではありません本当に定数。私は、この種の設定入力を処理する通常の方法は、読者Monadを使うことだと思います。
import Control.Monad.Reader
-- type of our context, one double value.
-- This is not really necessary, you could just use Double everywhere
-- I use C.
newtype C = C Double
deriving (Show, Eq)
main :: IO()
main = do
-- Read a double from the user.
c <- getLine >>= return . read :: IO Double
-- Run the computation, given a context/configuration with
-- the user input.
print $ runReader foo (C c)
-- Computation dependent on our context.
foo :: Reader C Double
foo = do
C x <- ask -- Get the value of our context.
return $ x + 10 -- and use it
'value = unsafePerformIO $ entryGetText myTextEntry'の何が問題なのですか? ( 'unsafePerformIO'はその環境に依存しないことを除いて) – chepner
なぜunsafePerformIOを使用していますか? –
あなたは理論的に純粋な言語で無害にコードを作成しようとしています。これは上り坂です。 – Carcigenicate