gpt4 book ai didi

Haskell:从 ghci 提示符中将表达式读取为整数?

转载 作者:行者123 更新时间:2023-12-02 18:06:05 25 4
gpt4 key购买 nike

我正在尝试一些数论函数,并处理大整数。但是,我希望能够从提示中读取表达式。我有一个由 定义的函数

factor :: Integer -> Integer

如果我输入

ghci> factor 2047

效果很好。但我无法进入

ghci> factor 2^11-1

因为表达式 2^11-1 未(在提示符下)计算为 Integer。我可以解决这个问题

ghci> factor (toInteger 2^11-1)

但我想知道是否有一种方法可以自动将表达式读取为Integer值?

最佳答案

这与需要表达式“计算为Integer值”无关。 Haskell 在需要时计算任何表达式,并根据环境需要的类型进行计算。

仅,factor 2^11-1解析(factor 2)^11 - 1,这显然不是您想要的想。 (其中不存在子表达式 2^11-1!)但是 factor (2^11 - 1) 或 – 某种首选风格 – factor $ 2^ 11 - 1 就可以了。

事实上, factor (toInteger 2^11-1) 也不像你想象的那样:它被解析为 factor ((toInteger 2)^11 - 1)。完全不需要编写 toInteger 2,而只需编写 2

Haskell 解析规则的简短概述:

  • 前缀函数应用始终具有优先权。因此,f x^y 被解析为 (f x)^y,而不是 f (x^y)
    • 这从左到右贪婪地工作。因此,f x y 被解析为 (f x) y,而不是 f (x y)
  • 中缀运算符根据其固定性进行解析,例如您可以使用 :i ^ 在 GHCi 中查找。例如,infixr 8 ^ 高于 infixl 6 -,这就是为什么 2^11-1 被解析为 (2^ 11) - 1 而不是 2 ^ (11-1)
    • 如果链接同一运算符的多个实例,固定性中的 lr 表示方向。例如,infixr 5 : 表示 1:2:3:[] 被解析为 1:(2:(3:[])),而不是 ((1:2):3):[]
<小时/>

事实上,情况并不总是如此。像 2 这样的文字是多态的,即它们实际上可以被评估为您要求的任何类型。例如,2 * 3 + 4 * sin 5::Double 将执行浮点乘法/加法的所有操作。而 toInteger 实际上受到限制,因此结果必须始终是整数(如果您尝试在需要 Double 的设置中使用它,这实际上将是一个编译-时间错误!),即它实际上相当于 (2::Integer)

尽管在很多方面,其行为更像其他语言所写的 f(x,y)。这在 Haskell 中也是合法的,尽管有点不习惯。 (那么 f 实际上不是两个参数的函数,而是一个恰好是元组的单个参数的函数。)

关于Haskell:从 ghci 提示符中将表达式读取为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34712332/

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