成分是在Haskell非常正常的,但我只知道,我可以定義一個複合功能的特殊行爲,說如何在`.hs`文件中爲複合函數定義'特殊'行爲?
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
是okey)。
你不能這樣做。 '(floor。sqrt)n'把'floor'和'sqrt'視爲變量,而不是函數,所以這應該適用於所有函數,在這個定義中恰好被稱爲'floor'和'sqrt'。也可以說'(g。f)n'。至於你的特殊專業化,這在Haskell中是不可能的,你必須得到你需要的其他方式。 – luqui