Haskell getStdRandom$randomR返回什么?
我写了一个简短的Haskell程序,编译时没有任何问题Haskell getStdRandom$randomR返回什么?,haskell,random,Haskell,Random,我写了一个简短的Haskell程序,编译时没有任何问题 import System.Random func1=getStdRandom $ randomR ('A','Z') main = do print =<< func1 有人能告诉我为什么两个相似的元组(Char,Char)和(Int,Int)生成不同类型的签名函数吗 如果我移动了这个函数,它就不会编译 import System.Random main = do print =<< getStdRandom
import System.Random
func1=getStdRandom $ randomR ('A','Z')
main = do
print =<< func1
有人能告诉我为什么两个相似的元组(Char,Char)和(Int,Int)生成不同类型的签名函数吗
如果我移动了这个函数,它就不会编译
import System.Random
main = do
print =<< getStdRandom $ randomR ('A','Z')
导入系统。随机
main=do
print=在Haskell中编写数字文本时,它可以是Num
typeclass的任何实例。这包括Float
、Double
、Int
、Integer
等。因此编译器不知道您在谈论哪个Num
,因此必须指定您的意思是Int
。另一方面,字符文本总是Char
s,因此不需要指定类型
Prelude System.Random> getStdRandom $ randomR (1,100) :: IO Int
88
Prelude System.Random> getStdRandom $ randomR (1,100) :: IO Double
10.275865473218671
有人能告诉我为什么两个相似的元组(Char,Char)和(Int,Int)生成不同类型的签名函数吗
像(1100)
这样的元组没有类型(Int,Int)
,因为Haskell中的所有数字文本都是多态的,除非可以从上下文推断出特定类型
我不知道为什么“打印”=
有人能告诉我为什么两个相似的元组(Char,Char)和(Int,Int)生成不同类型的签名函数吗
在Haskell中,整型文字实际上具有类型Num t=>t
:
Prelude> :t 1
1 :: Num t => t
=>
之前的部分是类型约束。它表示类型t
必须实现Num
类。而=>
之后的部分是类型,在本例中就是t
。这意味着文本1
可以具有实现Num
类的任何类型t
。
类型类是一种表示类型支持一组函数的方式,在本例中,每个类型A
都是(即实现)的实例Num必须有一个函数fromInteger::Integer->a
。Haskell现在将所有整型文字(如1
到fromInteger 1
),其中1
的类型为Integer
)
Prelude System.Random> getStdRandom $ randomR (1,100) :: IO Int
88
Prelude System.Random> getStdRandom $ randomR (1,100) :: IO Double
10.275865473218671
print =<< getStdRandom $ randomR ('A','Z')
(print =<< getStdRandom) $ (randomR ('A','Z'))
print =<< (getStdRandom $ randomR ('A','Z'))
Prelude> :t 1
1 :: Num t => t