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”上指定了类型约束。