......这段代码:
randomRIO (0, 2 :: Int).但它产生了IO Int......
不,这是一个IO Int价值.这样的值类似于int f()过程语言中的"函数" .如果这是,比方说,Python,那么你也可以不只是写
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import random
In [2]: def f():
...: return random.randint(0,2)
...:
In [3]: [1,2,3][f]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-74d3c2a164a4> in <module>()
----> 1 [1,2,3][f]
TypeError: list indices must be integers or slices, not function
Run Code Online (Sandbox Code Playgroud)
相反,您需要调用该操作.只有这样才能产生一个Int数字.在大多数语言中,这只是通过提供参数来完成的,在这种情况下只是空元组():
In [4]: [1,2,3][f()]
Out[4]: 2
Run Code Online (Sandbox Code Playgroud)
但这混合了两个不同的概念,即提供论据和引起副作用.(在这种情况下,副作用是修改内置随机生成器的状态,因此每次都不会得到相同的数字.)
Haskell做得更好,它有专门的操作员来整理副作用的顺序.正如Daniel Wagner所说,这些是fmap和>>=.但是如果那些中缀运算符和高阶类型签名对你来说看起来很神秘,你也可以使用Haskell的do表示法,这实际上只是语法糖的同一件事:
main :: IO ()
main = do
randomIndex <- randomRIO (0,2)
print $ [1,2,3] !! randomIndex
Run Code Online (Sandbox Code Playgroud)
或者,在ghci提示符下(基本上是一个大块IO- do块)
GHCi, version 8.2.1: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/sagemuej/.ghci
Loaded GHCi configuration from /home/sagemuej/.ghc/ghci.conf
Prelude> :m +System.Random
Prelude System.Random> randomIndex <- randomRIO (0,2 :: Int)
Prelude System.Random> [1,2,3] !! randomIndex
1
Run Code Online (Sandbox Code Playgroud)
之间的差foo <- action和let foo = action是如在Python之差相似foo = action()和foo = action.