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
問題ありません)。