输入IO的haskell说明

时间:2013-11-11 22:53:12

标签: haskell

任何人都可以帮助我理解这个功能类型吗? stateOfMind :: BotBrain -> IO (Phrase -> Phrase)

stateOfMind是一个函数,BotBrain只是一种类型。

type Phrase = [String]
type PhrasePair = (Phrase, Phrase)
type BotBrain = [(Phrase, [Phrase])]

如果stateOfMind具有此类型:BotBrain -> (Phrase -> Phrase),那么 stateOfMind会以BotBrain作为参数来生成一个新函数,该函数将Phrase作为结果并给出Phrase。 但现在我们有一个IO,即IO (Phrase -> Phrase)。 这是什么意思?

randomIO有monadic类型,但为什么喜欢这样?是因为我们选择的种子? Monadic我通常用于输入和输出,但是随机生成器在运行时实际上没有从用户那里获得任何输入。

1 个答案:

答案 0 :(得分:2)

stateOfMind :: BotBrain -> IO (Phrase -> Phrase)

stateOfMind需要BotBrain并返回IO操作,其结果是PhrasePhrase的函数。当您在IO (Phrase -> Phrase) monad中执行IO操作时,您将获得普通的纯函数Phrase -> Phrase

randomIO位于IO,因为它使用getStdRandom来更改全局标准随机数生成器的状态。对randomIO的多次调用可以(并且将会)返回不同的结果,这正是IO指示的结果。

您可以使用mkStdGen创建纯生成器,并从中纯粹获取值:

let
  g1 = mkStdGen 42      -- Seed value
  (r1, g2) = random g1  -- Get first random number
  (r2, g3) = random g2  -- Get second random number
in r1 + r2

这里摆脱重复的一种方便方法是使用State monad:

flip evalState (mkStdGen 42) $ do
  r1 <- state random
  r2 <- state random
  return (r1 + r2)