2013-09-26 51 views
4

我寫了這個代碼:哈斯克爾導入錯誤:在範圍上並不

import GHC.Float                 

next :: GHC.Float -> GHC.Float-> GHC.Float           
next n x = (x + n/x)/2 

而且我收到以下錯誤:

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' 

模塊的進口沒有任何問題,所以我不當然,如果我指的是錯誤的名稱,或者標準Float模塊與IEEE GHC.Float相同,並且不需要顯式導入它。

我試着做一個import GHC.Float as Fl沒有成功 - 在Fl得到相同類型的錯誤。

我剛剛開始Haskell(顯然),所以任何幫助表示讚賞!

+0

'GHC.Float'是模塊的名稱,它不能代替類型名稱的使用。 'GHC.Float.Float'是您可以使用的類型名稱,但正如下面的答案所示,它顯然是多餘的。 –

回答

5

您不必手動導入GHC.Float,你可以只寫Float,像這樣

next :: Float -> Float -> Float 
next n x = (x + n/x)/2 

GHC隱含導入一個在你擁有的每源文件調用Prelude模塊。 Prelude包含許多方便的類型,函數和其他用作語言「內置」的東西。類型,如IntFloatMaybeIO和功能,如head+/,等等。


您可以測試是否一個浮點數與功能isIEEEGHC.Float模塊的IEEE浮點:

import GHC.Float 

main = do 
    putStr "1.0 is an IEEE floating point: " 
    print $ isIEEE (1.0 :: Float) 

如果你運行它,它會打印True


我應該也提到過你之前沒有編譯代碼的原因是因爲當你導入一個只有的模塊時,它的一切都進入了範圍。您可以強制使用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] 
+0

標準模塊是否使用IEEE浮點標準? – marsella

+0

@marsella我將編輯我的答案,向您展示如何測試這個示例代碼,因爲它需要幾行 – bheklilr

+0

@marsella完成,請參閱對我的答案的編輯 – bheklilr