3 回答

TA貢獻1783條經驗 獲得超4個贊
大多數時候,您可以依靠類型推斷來為您確定簽名。在您的示例中,以下足夠了:
Prelude> let addTwo x y = x + y
如果您確實想要帶有類型簽名的定義,或者您的定義跨越多行,則可以在ghci中執行以下操作:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 4 7
11
請注意,您也可以將其壓縮到一行:
Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y
您可以在文檔提示部分的“ 交互評估”中找到有關與ghci交互的更多信息。

TA貢獻1817條經驗 獲得超6個贊
通過啟動GHCI并輸入:set +m以下命令來解決此問題:
Prelude> :set +m
Prelude> let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude|
Prelude> addTwo 1 3
4
繁榮。
這里發生的事情(我主要是在和您聊天,在通過“ 了解您的Haskell”工作時,正在谷歌上尋求幫助的人)是GHCI是一個交互式環境,您可以在其中動態更改函數名稱的綁定。您必須將函數定義包裝在一個let塊中,以便Haskell知道您將要定義一些內容。這些:set +m東西是多行:{ 代碼 :}構造的簡寫。
空格在塊中也很重要,因此您必須在類型定義之后縮進四個空格,以說明函數中的四個空格let。

TA貢獻1825條經驗 獲得超6個贊
從GHCI版本8.0.1開始,let不再需要在REPL上定義功能。
因此,這應該適合您:
λ: addTwo x y = x + y
λ: addTwo 1 2
3
λ: :t addTwo
addTwo :: Num a => a -> a -> a
Haskell的類型推斷提供了適用于浮點數的通用類型化:
λ: addTwo 2.0 1.0
3.0
如果您必須提供自己的鍵入內容,則似乎需要let結合使用多行輸入(用于:set +m在GHCI中啟用多行輸入):
λ: let addTwo :: Int -> Int -> Int
| addTwo x y = x + y
|
λ: addTwo 1 2
3
但是,如果Int由于非多態輸入而嘗試傳遞除a以外的任何內容,則會出現錯誤:
λ: addTwo 2.0 1.0
<interactive>:34:8: error:
? No instance for (Fractional Int) arising from the literal ‘2.0’
? In the first argument of ‘addTwo’, namely ‘2.0’
In the expression: addTwo 2.0 1.0
In an equation for ‘it’: it = addTwo 2.0 1.0
- 3 回答
- 0 關注
- 711 瀏覽
添加回答
舉報