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
    类型,然后您可以选择您想要的类型。您可以按原样离开,也可以像现在这样将其“转换”为
    积分