[英]Type in haskell explanation of IO
有人可以帮助我了解此功能类型吗? 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我通常用于输入和输出,但是随机生成器实际上在运行时没有从用户那里获得任何输入。
stateOfMind :: BotBrain -> IO (Phrase -> Phrase)
stateOfMind
接受BotBrain
并返回IO
操作,其结果是从Phrase
到Phrase
的函数。 在IO
monad中执行IO (Phrase -> Phrase)
操作时,将获得普通的纯函数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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.