Haskell 从整型创建列表时出现类型错误
我正在尝试实现一个简单的函数:Haskell 从整型创建列表时出现类型错误,haskell,integer,Haskell,Integer,我正在尝试实现一个简单的函数:toClient: copinite::Integral a=>a->a->Bool 互质AB=gcd AB=1 ToClient::积分a=>a->a totient m=长度$filter(互质m)[1..m-1] ghci>:load 99problems.hs [1/1]编译Main(99problems.hs,已解释) 99问题。hs:250:13:错误: •无法将预期类型“a”与实际类型“Int”匹配 “a”是一个刚性类型变量,由 以下项的类型签名: 托
toClient
:
copinite::Integral a=>a->a->Bool
互质AB=gcd AB=1
ToClient::积分a=>a->a
totient m=长度$filter(互质m)[1..m-1]
ghci>:load 99problems.hs
[1/1]编译Main(99problems.hs,已解释)
99问题。hs:250:13:错误:
•无法将预期类型“a”与实际类型“Int”匹配
“a”是一个刚性类型变量,由
以下项的类型签名:
托蒂:对所有a。积分a=>a->a
在99点。hs:249:12
•在表达式中:长度$filter(互质m)[1..m-1]
在“totient”的方程式中:
totient m=长度$filter(互质m)[1..m-1]
•相关绑定包括
m::a(绑定到990.hs:250:9)
ToClient::a->a(绑定到990.hs:250:1)
失败,已加载模块:无。
我试着在
(m-1)
上使用像from integral
或to integer
这样的东西,但都不起作用。我不确定我错过了什么。。。似乎Int
应该是一个类型Integral a=>a
。怎么了?类型积分a=>a->a
显示:
a
a
是Integral
的实例a
的值a
的值但是,在这种情况下,实现者生成了一个
Int
。任何时候调用方选择a
作为非Int
的Integral
实例时,这将与调用方的类型不匹配。类型Integral a=>a->a
表示:
a
a
是Integral
的实例a
的值a
的值但是,在这种情况下,实现者生成了一个
Int
。任何时候调用方选择a
作为非Int
的Integral
实例时,这将与调用方的类型不匹配。长度的类型是length::Foldable t=>ta->Int
。但是您明确地说,ToClient
应该返回一个积分a
。正如答案所解释的,fromIntegral(Num b,Integral a)=>a->b
意味着调用者(length
函数)需要向其提供任何积分a
Int
是一个积分
,因此此项检查有效。然后,from integral
返回一个Num b
,用户(toClient
函数)选择该类型。在本例中,您选择它作为类型声明中的整数。请注意,当您“选择”返回的类型时,您不需要限制它,在本例中,您可以返回Num b
,它仍然有效。您还可以使用genericLength
(来自数据.List
)来修复它而不是长度
。length
的返回类型是单态的,这可能非常令人恼火,这似乎是标准库的初始设计中的一个错误,我们希望在将来的版本中对其进行更改。但是fromIntegral
返回的是一个通用的Num
类型,然后您可以选择您想要的类型。你可以按原样离开,或者你可以像你所做的那样把它“转换”成一个积分长度的类型是length::Foldable t=>ta->Int
。但是您明确地说,ToClient
应该返回一个积分a
。正如答案所解释的,fromIntegral(Num b,Integral a)=>a->b
意味着调用者(length
函数)需要向其提供任何积分a
Int
是一个积分
,因此此项检查有效。然后,from integral
返回一个Num b
,用户(toClient
函数)选择该类型。在本例中,您选择它作为类型声明中的整数。请注意,当您“选择”返回的类型时,您不需要限制它,在本例中,您可以返回Num b
,它仍然有效。您还可以使用genericLength
(来自数据.List
)来修复它而不是长度
。length
的返回类型是单态的,这可能非常令人恼火,这似乎是标准库的初始设计中的一个错误,我们希望在将来的版本中对其进行更改。但是fromIntegral
返回的是一个通用的Num
类型,然后您可以选择您想要的类型。您可以按原样离开,也可以像现在这样将其“转换”为积分