2016-02-29 69 views
0

我試圖定義一個像「Int」這樣的特定類型的值,但似乎Prelude不支持它?如何在Haskell的「let」表達式中使用「type」定義值?

Prelude> let c::Int = 4 
Prelude| 

<interactive>:49:8: 
    Illegal type signature: ‘Int’ 
     Perhaps you intended to use ScopedTypeVariables 
    In a pattern type-signature 
Prelude> let [Int]c=4 
Prelude| 

<interactive>:51:5: Parse error in pattern: [Int] 

如何糾正它?

+2

類型簽名可以出現在自己的行上(在let,where或top level聲明中)或表達式中。類型簽名不適用於綁定的左側。 –

+0

[GHCi中的多行命令]可能重複(http://stackoverflow.com/questions/8443035/multi-line-commands-in-ghci) –

+2

「如何更正它?」 - 錯誤說明 - 「也許你打算使用ScopedTypeVariables」。用':set -XScopedTypeVariables'在ghci中啓用ScopedTypeVariables。也就是說,如果你想使用這個特定的語法。 – user2407038

回答

5

這將做到這一點

let x = 1::Int 
4

在一個Haskell文件,類型聲明與定義單獨提供,通常前行:

c :: Int -- Type declaration 
c = 4  -- Definition 

這適用於局部定義真,以及作爲全球性的;你只需要確保縮進排列。因此,在這種情況下,我們有

let c :: Int 
    c = 4 
in c + c 

在Haskell,換行和縮進可以用括號和分號來代替,有時括號可以省略。在GHCi中,在輸入多行輸入需要some extra machinery時,通常需要分號分隔的變體;以機智,那將是

let c :: Int ; c = 4 

(缺乏in是因爲GHCI的行爲有點像do塊; this Stack Overflow question有更多的信息)

但是,它看起來與您的及時喜歡你有:set +m打開,這樣你就可以使用多行選項太:

Prelude> let c :: Int 
Prelude|  c = 4 
Prelude| 
Prelude> 

(另外,如果你想以後添加類型註釋,let c = 4 ; c :: Int工作正常,它只是沒有一個文件的最好的風格你「R E使用上)


此外,一個重要的注意事項:不使用「前奏」,你正在使用GHCi,GHC的交互式哈斯克爾環境。 Prelude是在所有Haskell程序中默認導入的模塊(它提供了Bool,Eq,(.)等等的定義)。 GHCi的默認提示包含當前導入的所有模塊列表,因此默認爲Prelude>;但是,如果鍵入import Data.Function,則提示將更改爲Prelude Data.Function>

相關問題