2014-07-21 82 views
0

我是Haskell的新手,作为一种学习方式(第一个项目),我将代码从Tcl移植到Haskell。该项目是一个特定于域的查询语言,通过语义层转换为SQL查询。现在,随着解析器的语言限制的查询语言,对运营商类似,这段代码实际上在Haskell似乎更傻比Tcl中做了:-)关于Haskell代码片段的建议?

type MatchOperator = [Char] 

getOpJoiner :: MatchOperator -> String 
getOpJoiner "!=" = " and " 
getOpJoiner "!~" = " and " 
getOpJoiner "!~~" = " and " 
getOpJoiner _ = " or " -- In reality, this can only be "=", "~", "~~" or "==" according to the parser 

的代码做什么是应该做的(根据所使用的查询操作符返回适当的SQL逻辑连接器),但我相信它可以变得更漂亮。

+0

我的猜测是,你可能想添加一些更多的打字,以确保你不会结束语法不正确的SQL? – didierc

+1

如果要这样做,你可能想要做的事情是“Haskell方式”是使用像parsec这样的解析器将DSL转换为具体的数据类型,然后从中生成SQL查询。这将是安全的做事方式,即使它需要更多的代码。当然,你的代码可能比Tcl中的代码长,但它肯定会更安全,更健壮,并且如果正确地完成了更多的扩展。 – bheklilr

+0

为什么我试图将我的代码移植到Haskell当然有很多原因。 ;-)现在,我想要做的是以某种方式压缩第1-3行。 –

回答

1

如果你只是想削减的代码行,试试这个:

getOpJoiner :: MatchOperator -> String 
getOpJoiner x 
      | x `elem` ["!=","!~","!~~"] = " and " 
      | otherwise = " or " 

elem用来检查输入匹配任何在列表中的字符串。

此功能将起作用。不过,我认为最好是投资于@bheklilr提出的解决方案,因为他提到的原因。