gpt4 book ai didi

haskell - Haskell 中的类型声明

转载 作者:行者123 更新时间:2023-12-03 15:01:17 24 4
gpt4 key购买 nike

我刚开始学习 Haskell。我决定为自己设定一个目标,即实现我的旧算法 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.79.7006&rep=rep1&type=pdf

作为开始,我编写了以下代码

phi [] = [1..]
phi (p:pl) = (phi pl) `minus` (map (p*) $ phi pl)
primes x
| x < 2 = []
| otherwise = smallprimes ++ (takeWhile (<=x) $tail $ phi $ reverse smallprimes)
where smallprimes = primes $ sqrt x

minus (x:xs) (y:ys) = case (compare x y) of
LT -> x : minus xs (y:ys)
EQ -> minus xs ys
GT -> minus (x:xs) ys
minus xs _ = xs

这按预期工作,除了素数列表是浮点数!一个小小的想法告诉我,由于 sqrt 的签名是
sqrt :: (Floating a) => a -> a

Haskell 编译器决定 primes 返回浮点数列表。
然而,当我试图告诉它
phi :: [Integer] -> [Integer]

这就是我想要的,编译器有问题:
No instance for (Floating Integer)
arising from a use of `sqrt` at ...

那么我如何表示 phi 将整数列表作为输入并作为输出产生无限的整数列表?

最佳答案

您的代码中的问题是,sqrt需要一个浮点数并返回相同的值。您必须使用转换类型以使其工作的包装器。 (本质上就是错误消息所说的):

smallprimes = primes . ceiling . sqrt . fromIntegral $ x

Haskell 没有在不同的数字类型之间进行自动转换,因为这在 Haskell 的类型系统中是不可能的。

关于haskell - Haskell 中的类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7519258/

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