gpt4 book ai didi

haskell - 如何在 'special' 文件中定义复合函数的 `.hs` 行为?

转载 作者:行者123 更新时间:2023-12-02 14:09:10 25 4
gpt4 key购买 nike

组合在 Haskell 中是很正常的,但我只知道我可以定义组合函数的特殊行为,说

Prelude> (floor . sqrt) (10^55)
3162277660168379365112938496
Prelude> let (floor . sqrt) n | n < 2 = n | otherwise = head $ dropWhile (\x -> x^2 > n) $ iterate (\x -> (x + n `div` x) `div` 2) (n `div` 2)
Prelude> (floor . sqrt) (10^55)
3162277660168379331998893544

特殊定义函数的结果是正确的(因为第一个函数存在浮点错误)。

现在我想在 .hs 文件中执行相同的操作,例如

(floor . sqrt) n
| n < 2 = n
| otherwise = head $ dropWhile (\x -> x^2 > n)
$ iterate (\x -> (x + n `div` x) `div` 2) (n `div` 2)

main = do
print $ (floor . sqrt) (10^55)

这次ghc对我大喊大叫

Ambiguous occurrence `.'
It could refer to either `Main..', defined at me.hs:1:8
or `Prelude..',
imported from `Prelude' at me.hs:1:1
(and originally defined in `GHC.Base')

那么是否可以在 .hs 文件中定义这样的函数? (不过,在 main 中用 let 定义它是可以的)。

最佳答案

首先,您在 GHCi 中的示例并未定义 floorsqrt 的特殊组合。相反,它定义了一个运算符 (.),它接受三个名为 floorsqrtn 的参数并隐藏名为 (.) 的现有标准函数。

然后,您将新函数应用到标准库函数 floorsqrt,它们将成为新 (.)< 中具有相同名称的参数 函数。

您得到的错误是因为顶级定义不会自动隐藏现有定义,而且无论如何这显然不是您真正想要做的。

现在,您当然可以定义一个全新的函数(希望有自己的名称,如 groovy 的答案)来执行您的专用 floor 。 sqrt 函数,但 Haskell 本身无法将其定义为现有函数的专门版本。

您可能想到并且可能使用 compiler pragma rewrite rules在 GHC 中自动用等效的改进版本替换特定表达式。不过,您应该小心,重写的表格给出的答案与其替换的答案相同。否则,您将面临一些令人困惑的调试 session 的风险。

关于haskell - 如何在 'special' 文件中定义复合函数的 `.hs` 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16090101/

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