2010-12-03 40 views
6

我已經聲明瞭以下結構的遞歸類型值構造:我能有一個名爲「/」「

data Path = GET | POST | Slash Path String 

我很想,去年值構造重命名爲/使我可以綴它的可愛表情像GET /"controller"/"action"但是,如果我嘗試這樣做:

import Prelude hiding ((/)) 
infixr 5/
data Path = GET | POST | Path/String 

...然後我得到這個:

Path.hs:4:30: parse error on input `/' 

如果我將/替換爲:/或以:開頭的任何其他特殊字符序列,那些相同的三行編譯就好了。

那麼,有沒有什麼辦法可以命名我的價值構造函數/?我知道,我可以將其命名爲Slash然後聲明一個單獨的函數:

(/) :: Path -> String -> Path 
(/) = Slash 

...但是,這不會讓我的模式匹配,如:

request :: Path -> String 
request path = case path of GET /"hello" -> "Hello!" 
          GET /"goodbye" -> "Goodbye!" 

回答

11

簡短的回答:第

龍答:類型類別,類型名稱和數據構造必須以大寫字母或冒號開始(有些這需要使用語言擴展)。其他一切必須以小寫字母或任何其他允許的符號開頭。

請注意,類型變量(通常爲小寫字母標識符)遵循相同的規則並且不以冒號開頭。

另請參閱the GHC user's guide用於啓用類型運算符。數據構造函數總是被允許的,我想。

就你個案而言,我只是使用(:/)。它看起來並不那麼糟糕,過了一段時間,你習慣於忽略冒號。有些人喜歡尾隨冒號,特別是如果數據在某種意義上是「對稱的」。

+17

看到`:/`遍佈我的代碼會讓我想知道它爲什麼如此失望。 – zinglon 2010-12-03 19:37:17

+0

@zinglon:Hrhrhrhrhr。幸運的是,運營商中允許使用幾乎所有非字母數字的Unicode字形,所以表情符號的可能性幾乎是無限的。尤其是像這樣的父母使用它的前綴,想象一下所有的移位 - JIS垃圾你可以這樣做! – 2010-12-03 19:55:20

2

我認爲所有構造函數操作員需要以冒號開頭,(但我可能是錯的)。

所以,你可以這樣做:

data Path = GET | POST | Path :/ String 
6

不,你不能這樣做。在純粹的Haskell 98中,用戶定義的類型名稱和構造函數必須是字母數字並以大寫字母開頭;這是in section 4.1.2 of the Haskell 98 Report。在GHC中,正如用戶定義的帶字母數字名稱的構造函數必須以大寫字母開頭,用戶定義的構造函數必須以:開頭。 (對於用戶定義的類型名稱也是如此。)這在section 7.4.2 of the GHC manual中有記錄。我可能使用:/,我自己,有或沒有/作爲同義詞。


1:的原因「用戶定義的」限定的是,有一些內置的例外:->[]()和的元組類型(,)(,,)等類型名稱;和()和元組類型構造函數(,),(,,)等,作爲類型構造函數

相關問題