Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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 类型:(数量a,Ord a)与(整数a)?_Haskell - Fatal编程技术网

Haskell 类型:(数量a,Ord a)与(整数a)?

Haskell 类型:(数量a,Ord a)与(整数a)?,haskell,Haskell,在文件中,我试图定义如下函数: myReplicate :: (Int a) => a -> b -> [b] myReplicate n x | n <= 0 = [] | otherwise = x : myReplicate (n-1) x ghci>myReplicate 3.2 1 [1,1,1,1] ghci告诉我myReplicate的类型应该是: ghci>:t myReplicate myRepli

在文件中,我试图定义如下函数:

myReplicate :: (Int a) => a -> b -> [b]  
myReplicate n x  
    | n <= 0    = []  
    | otherwise = x : myReplicate (n-1) x  
ghci>myReplicate 3.2 1
[1,1,1,1]
ghci告诉我myReplicate的类型应该是:

ghci>:t myReplicate 
myReplicate :: (Num a, Ord a) => a -> a1 -> [a1]
如果我将类型声明更改为ghci建议的类型:

myReplicate :: (Num a, Ord a) => a -> b -> [b]
…然后函数编译并“工作”。但是,它是这样“工作”的:

myReplicate :: (Int a) => a -> b -> [b]  
myReplicate n x  
    | n <= 0    = []  
    | otherwise = x : myReplicate (n-1) x  
ghci>myReplicate 3.2 1
[1,1,1,1]

为什么我不能声明myReplicate只接受Int作为第一个参数(同样考虑到Int从Ord类派生(?)的事实)?我想我可以将我的第一个保护更改为x<1,这样myReplicate 3.2 1就可以生成[1,1,1,],但是为什么我要费心处理浮点数呢?

Int是一个类型,而不是一个类型类。你想要的是

myReplicate :: Int -> b -> [b]
或者更准确地说

myReplicate :: Int -> Int -> [Int]

这里有一个关于类型和类型类的很好的教程:

这就是示例的来源,尽管稍后将在递归部分介绍。在任何情况下,据我所知,我应该使用以下语法声明“类型约束”:(sometypea)=>,我想声明一个适用于第一个参数变量的Int类型约束。是的,但是
Int
是一个类型,而不是一个类型类。最接近的类型类可能是
Integral
@7stud:这种语言有点误导性,它们被称为“类型约束”,因为它们是类型约束(按类型类),而不是类型约束(按注释)。@7stud不需要使用具体类型来约束类型变量;您不必将类型声明为类型变量
a
,然后将
a
约束为
Int
,您只需首先将类型声明为
Int
。“它们被称为“类型约束”,因为它们是对类型的约束(按类型类)”。我现在明白了。当您编写这样的函数类型[a]->a时,“a”表示任何类型。但是如果您为函数指定了一个约束,例如:(Eq a)=>[a]->a,那么您已经将类型“a”从任何类型约束为仅实现Eq中指定的函数的类型。因此,您已经在“a”上指定了类型约束。