2014-07-21 121 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提出的解決方案,因爲他提到的原因。