2014-11-14 39 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

相关问题