2014-11-14 105 views
1

例如,如何可以利用大寫字母這樣我定義一個函數來生成斐波那契數:FIBÑ 我需要只使用大寫字母這樣從終端調用該函數:FIB 7如何在Haskell中使用大寫字母定義函數?

+0

恐怕你不能。看看關於同樣事情的鏈接問題,瞭解更多的細節和策略來解決這個限制。 – 2014-11-14 21:10:41

回答

3

You can't。 Haskell中的函數必須以小寫unicode字符或下劃線開頭。以大寫字母開頭的符號保留給類型和構造函數。

爲什麼你需要調用從只使用大寫字母終端的功能?這似乎是一個相當武斷的約束。


如果你真的想讀STDIN和過程,我建議寫這樣的事情

import System.IO 
import Text.Read (readMaybe) 
import Control.Monad (forever) 

data Operation 
    = FIB Integer 
    | FAC Integer 
    | ADD Integer Integer 
    deriving (Read) 
-- The read instance is important here 

fib :: Integer -> Integer 
fib 0 = 1 
fib 1 = 1 
fib n = fib (n - 1) + fib (n - 2) 

eval :: Operation -> Integer 
eval (FIB n) = fib n 
eval (FAC n) = product [1..n] 
eval (ADD a b) = a + b 

repl :: IO() 
repl = forever loop 
    where 
     parseResponse :: String -> String 
     parseResponse resp = case readMaybe resp of 
      Just op -> show $ eval op 
      Nothing -> "Invalid operation" 
     loop = do 
      putStr "> " 
      resp <- getLine 
      putStrLn $ parseResponse resp 

main :: IO() 
main = do 
    hSetBuffering stdin LineBuffering 
    hSetBuffering stdout NoBuffering 
    repl 

這允許用戶在數據構造的確切姓名後,那麼你就可以解釋這個數據構造函數(是的,這是一個非常簡單的交互式腳本語言的完整代碼,只能執行fibs,階乘和添加)到結果中。如果輸入了無效操作,它將以Invalid operation進行響應。您只能用CTRL-C退出翻譯。

+0

這是一堂課。無論如何,你認爲實現這一目標的唯一方法是通過獲取字符串輸入並處理它來調用所需的函數嗎? – Reeshabh 2014-11-14 21:12:54

+0

@Reeshabh在這種情況下,是的。如果你要爲你的類寫某種[REPL(http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop),你就必須做到這一點無論如何解析。如果你只是想在GHCi中做到這一點,那麼你將不得不使用一個以小寫字母開頭的標識符。我將編輯我的答案,以展示您可以做什麼的幾個例子。 – bheklilr 2014-11-14 21:14:52

+0

謝謝。這非常有幫助! – Reeshabh 2014-11-14 22:44:26

0

好了,你不能。函數和變量名稱必須以小寫字母開頭。第一個大寫字母被保留用於類型構造: Haskell specs

+0

不只是類型的構造函數;一般的構造函數,以及類。 – dfeuer 2014-11-14 21:35:24