从 Haskell 中的 Int 获取 sqrt

发布于 2024-11-19 23:07:49 字数 133 浏览 1 评论 0 原文

如何从 Int 获取 sqrt

我尝试这样做:

sqrt . fromInteger x

但是出现类型兼容性错误。

How can I get sqrt from Int.

I try so:

sqrt . fromInteger x

But get error with types compatibility.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧街凉风 2024-11-26 23:07:49

也许您也希望结果是 Int

isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral

您可能需要将 floor 替换为 ceilinground
(顺便说一句,这个函数的类型比我给出的函数更通用。)

Perhaps you want the result to be an Int as well?

isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral

You may want to replace floor with ceiling or round.
(BTW, this function has a more general type than the one I gave.)

云仙小弟 2024-11-26 23:07:49

使用 fromIntegral

Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral  x)
2.23606797749979

IntInteger 都是 Integral 的实例:

  • fromIntegral :: (积分a,数字b) =>一个-> b 获取您的 Int(它是 Integral 的实例)并将其“变成”Num

  • sqrt ::(浮动a)=>一个-> a 需要一个 Floating,并且 Floating 继承自 Fractional,而 Fractional 又继承自 Num,因此您可以安全地将 fromIntegral 的结果传递给 sqrt

我认为类 Haskell Wikibook 中的 rel="noreferrer">图表 在这方面非常有用案例。

Using fromIntegral:

Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral  x)
2.23606797749979

both Int and Integer are instances of Integral:

  • fromIntegral :: (Integral a, Num b) => a -> b takes your Int (which is an instance of Integral) and "makes" it a Num.

  • sqrt :: (Floating a) => a -> a expects a Floating, and Floating inherit from Fractional, which inherits from Num, so you can safely pass to sqrt the result of fromIntegral

I think that the classes diagram in Haskell Wikibook is quite useful in this cases.

表情可笑 2024-11-26 23:07:49

请记住,应用程序比任何其他运算符绑定得更紧密。这包括构图。您想要的是

sqrt $ fromIntegral x

then

fromIntegral x 

将首先被评估,因为隐式应用程序(空格)比显式应用程序($)绑定更紧密。

或者,如果您想了解组合如何工作:

(sqrt .  fromIntegral) x

括号确保首先计算组合运算符,然后生成的函数是应用程序的左侧。

Remember, application binds more tightly than any other operator. That includes composition. What you want is

sqrt $ fromIntegral x

Then

fromIntegral x 

will be evaluated first, because implicit application (space) binds more tightly than explicit application ($).

Alternately, if you want to see how composition would work:

(sqrt .  fromIntegral) x

Parentheses make sure that the composition operator is evaluated first, and then the resulting function is the left side of the application.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文