任何人都可以帮助我理解这个功能类型吗?
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我通常用于输入和输出,但是随机生成器在运行时实际上没有从用户那里获得任何输入。
答案 0 :(得分:2)
stateOfMind :: BotBrain -> IO (Phrase -> Phrase)
stateOfMind
需要BotBrain
并返回IO
操作,其结果是Phrase
到Phrase
的函数。当您在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)