Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell getStdRandom$randomR返回什么?_Haskell_Random - Fatal编程技术网

Haskell getStdRandom$randomR返回什么?

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

我写了一个简短的Haskell程序,编译时没有任何问题

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