1

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

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

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

如果stateOfMind有这种类型:BotBrain -> (Phrase -> Phrase),则将 stateOfMindaBotBrain作为参数来生成一个新函数,该函数采用 aPhrase并给出 aPhrase作为结果。但现在我们有一个IO,即 IO (Phrase -> Phrase)。这意味着什么?

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

4

1 回答 1

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

stateOfMind接受 aBotBrain并返回一个IO动作,其结果是一个函数 from Phraseto Phrase。当你IO (Phrase -> Phrase)在 monad 中执行一个动作时IO,你会得到一个普通的纯函数Phrase -> Phrase

randomIOIO因为它用于getStdRandom改变全局标准随机数生成器的状态。多次调用randomIOcan(并且将)返回不同的结果,这正是所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

在这里摆脱重复的一种便捷方法是使用Statemonad:

flip evalState (mkStdGen 42) $ do
  r1 <- state random
  r2 <- state random
  return (r1 + r2)
于 2013-11-11T23:02:30.723 回答