Haskell导入错误:不在范围内

mar*_*lla 5 haskell scope ghc

我写了这段代码:

import GHC.Float                                                                 

next :: GHC.Float -> GHC.Float-> GHC.Float                                         
next n x = (x + n / x) / 2
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

numerical.hs:3:9:
    Not in scope: type constructor or class `GHC.Float'

numerical.hs:3:22:
    Not in scope: type constructor or class `GHC.Float'

numerical.hs:3:34:
    Not in scope: type constructor or class `GHC.Float'
Run Code Online (Sandbox Code Playgroud)

模块导入没有任何问题,所以我不确定我是用错误的名称引用它还是标准的Float模块与IEEE GHC.Float模块相同,并且不需要显式导入它.

我尝试做一个import GHC.Float as Fl没有成功 - 得到相同的类型错误Fl.

我刚刚开始Haskell(显然),所以任何帮助都表示赞赏!

bhe*_*ilr 5

你不必GHC.Float手动导入,你可以Float这样写

next :: Float -> Float -> Float
next n x = (x + n / x) / 2
Run Code Online (Sandbox Code Playgroud)

GHC隐式导入Prelude您拥有的每个源文件中调用的模块. Prelude包括许多方便的类型,函数和其他用作语言"内置函数"的东西.类型,如Int,Float,Maybe,IO,和功能,如head,+,/,等.


您可以isIEEE使用GHC.Float模块中的函数测试浮点数是否为IEEE浮点数:

import GHC.Float

main = do
    putStr "1.0 is an IEEE floating point: "
    print $ isIEEE (1.0 :: Float)
Run Code Online (Sandbox Code Playgroud)

如果你运行它,它将打印出来 True


我还应该提到你的代码之前没有编译的原因是因为当你导入一个模块时import,它的所有东西都进入了范围.您可以通过使用强制它来限定import qualified,这里有几个例子:

import GHC.Float -- Everything now in scope
import qualified Data.Maybe -- Have to use full name
import qualified Data.List as L -- aliased to L

main = do
    -- Don't have to type GHC.Float.isIEEE
    print $ isIEEE (1.0 :: Float)
    -- Have to use full name
    print $ Data.Maybe.isJust $ Nothing
    -- Uses aliased name
    print $ L.sort [1, 4, 2, 5, 3]
Run Code Online (Sandbox Code Playgroud)