组合在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
< p > 由于浮点数误差,< em >special定义函数的结果是正确的(与第一个函数相比)。
< p>现在我想在< code > .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 定义是可以的)。
(floor . sqrt) n
将floor
和sqrt
视为变量而不是函数,所以这对于所有名为floor
和sqrt
的函数都适用。最好说(g. f) n
。至于你的特殊化自定义,这在Haskell中是不可能的,你必须以其他方式获取所需内容。 - luqui