2

元の質問

Haskell の最近のバージョン (> 7.4.2?) には mtl パッケージが付属しており、これは State コンストラクタ自体を提供しなくなり、代わりに状態関数を提供します。

これは、ウィキブック ページの State の例を台無しにします: http://en.wikibooks.org/wiki/Haskell/Understanding_monads/State

誰かが「状態の紹介」という見出しの後の例を修正する方法を示すことができますか? それが小さな関数 rollDie と rollDice です。

このページの前の方に、「ステート モナドの定義」という見出しの近くに、一般的に何をすべきかを説明するメモ ボックスがありますが、私にはあいまいすぎます。

また、インポートとパッケージがどのように機能するかについてはよくわかりません。そのため、この例に関連する可能性のある重要なことは、必要なインポートを指定することかもしれません。それらも変更されている可能性があります。

ありがとう!

ソースコード

------- Adding code for ghci01.hs-------

-- http://en.wikibooks.org/wiki/Haskell/Understanding_monads/State
-- Introducing State heading and below

import Control.Monad
import System.Random

type GeneratorState = State StdGen

rollDie :: GeneratorState Int
rollDie = do generator <- get
             let (value, newGenerator) = randomR (1,6) generator
             put newGenerator
             return value

-- Test rollDie
-- evalState rollDie (mkStdGen 0)

rollDice :: GeneratorState (Int, Int)
rollDice = liftM2 (,) rollDie rollDie

-- Test rollDice
-- evalState rollDice (mkStdGen 666)

------- In GHCi --------
ghci> :l dice01.hs
[1 of 1] Compiling Main             ( dice01.hs, interpreted )
dice01.hs:7:23: Not in scope: type constructor or class `State'
dice01.hs:10:27: Not in scope: `get'
dice01.hs:12:14: Not in scope: `put'
Failed, modules loaded: none.

補遺

ここでつまずいた他の人のために:

この質問の主なトピックは、動作しないサンプル コードと、上記で参照したウィキブック ページの [メモ] ボックスの警告に関するものです。このボックスは、MTL バージョン > 2.0.0.0 の場合、Control.Monad.State の変更により、一部のサンプル コードが機能しないことを示しています。

私のテストには、GHC 7.4.2 を含む Haskell Platform 2012.4.0.0 と、mtl.cabal ファイルに基づいて、遅ればせながら 1.1.1.1 であることが判明した MTL が含まれていました。したがって、注記の警告は当てはまらないはずですが、それでもサンプル コードは機能しませんでした。こちらの回答で推奨されている変更 (import Control.Monad を Control.Monad.State に変更) で問題が解決しました。しかし明らかに、これはノートで参照されている MTL 2.x ではなく、以前の変更に関連する問題を修正していました。

それ以来、GHC 7.6.2 のソースを見てきましたが、MTL ライブラリがまったく見つかりません。代わりに、State 関連のファイルは libraries/transformers/Control/Monad/Trans/State にあります。次に、7.4.2 以降の GHC を使用する Haskell Platform が現在存在しない (つまり、7.6.2 がない) という問題を含め、多くの紛らわしい回り道をしました。

次に、このstackoverflow Q&Aを指すMTLドキュメント(http://www.haskell.org/haskellwiki/Monad_Transformer_Library )を見つけました: mtl、transformers、monads-fd、monadLib、および選択のパラドックス ...これは一種の説明です少なくとも2〜3年前の時点では、たくさんあります。

4

2 に答える 2

7

上記のコードには 1 つの問題しかありません

Control.Monad ===> Control.Monad.State

変化があなたを噛む唯一のリアルタイムは、あなたが次のようなものを持っているときです

foo :: State Int Int
foo = State $ \a -> (a, a) -- This is an error

しかし、それを修正するのは簡単です:

foo :: State Int Int
foo = state $ \a -> (a, a)

型コンストラクターStateはまだそこにあります。データ コンストラクターが のために隠されているだけですstate。両方とも同じ名前なので、少し紛らわしいです。

于 2013-02-22T04:19:11.357 に答える
4

Stateコードは、型シノニムを使用して正常にコンパイルされます。あなたはただする必要があります

import Control.Monad.State
于 2013-02-22T04:16:50.963 に答える