【发布时间】:2014-04-13 06:03:26
【问题描述】:
我有这个compile 函数,它应该接受一个字符串,然后产生一个表达式。
Expression 是这样定义的:
data Expression = Name Char | Lambda Char Expression | Apply Expression Expression
deriving Show
假设“编译”函数采用的字符串是:
"\\x.\\y.yx"
所以,最后compile 函数应该产生这个作为最终表达式:
Lambda 'x' (Lambda 'y' (Name 'y') (Name 'x'))
这是compile 函数:
compile :: [Char] -> Expression
compile (x:xs) = if [x] == "\\" then Lambda (head xs) (compile (tail xs))
else if [x] == "." then compile xs
else if null xs then Name x
else Name x
目前,此函数消除了表达式的最后一部分 ((Name 'x'))。我的问题是:
如果一旦我产生一个Name,我就不能继续用表达式的其余部分调用相同的函数,那么这个函数如何继续使用更多的Names?由于Expression 是这样定义的,如果Expression 是Name 它只有一个Name 而没有更多,那么它上面就没有表达式了。
我的意思是,我如何获取Expression 中的每一个Name,“告诉”Haskell 我想继续寻找Names,而不是在找到一个Name 时停止。
我认为也许创建另一个函数是个好主意,但我不知道如何多次调用该函数。事实是我真的不习惯 Haskell 中的递归,我真的需要一些帮助。
我该怎么做?
【问题讨论】: