gpt4 book ai didi

haskell - 类型 : (Num a, Ord a) 与 (Int a)?

转载 作者:行者123 更新时间:2023-12-02 14:09:00 24 4
gpt4 key购买 nike

在一个文件中,我试图定义一个这样的函数:

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

但是当我尝试将文件加载到 ghci 时,出现此错误:

ghci>:l 1.hs 
[1 of 1] Compiling Main ( 1.hs, interpreted )

1.hs:38:17:
`Int' is applied to too many type arguments
In the type signature for `myReplicate':
myReplicate :: Int a => a -> b -> [b]
Failed, modules loaded: none.

ghci 告诉我 myReplicate 的类型应该是:

ghci>:t myReplicate 
myReplicate :: (Num a, Ord a) => a -> a1 -> [a1]

如果我将类型声明更改为 ghci 推荐的内容:

myReplicate :: (Num a, Ord a) => a -> b -> [b]

...然后函数编译并“运行”。然而,它的“工作原理”是这样的:

ghci>myReplicate 3.2 1
[1,1,1,1]

为什么我不能声明 myReplicate 仅将 Int 作为第一个参数(也考虑到 Int 是 Ord 类的后代(?))?我想我可以将我的第一个守卫更改为 x < 1,以便 myReplicate 3.2 1 会生成 [1, 1, 1,],但为什么我必须为 float 烦恼?

最佳答案

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

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

或更准确地说

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

这是关于类型和类型类的很好的教程:http://learnyouahaskell.com/types-and-typeclasses

关于haskell - 类型 : (Num a, Ord a) 与 (Int a)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com