我寫的Text.Regex類型類的相當透徹的描述another answer。
複製大部分在這裏......
所有Text.Regex.*
模塊大量使用類型類,這是那裏的可擴展性和「超載」般的行爲,但要使用從只看到不太明顯類型。
現在,您可能已經從基本的=~
匹配器開始。
(=~) ::
(RegexMaker Regex CompOption ExecOption source
, RegexContext Regex source1 target)
=> source1 -> source -> target
(=~~) ::
(RegexMaker Regex CompOption ExecOption source
, RegexContext Regex source1 target, Monad m)
=> source1 -> source -> m target
要使用=~
,必須存在的RegexMaker ...
實例的LHS,並RegexContext ...
的RHS和結果。
class RegexOptions regex compOpt execOpt | ...
| regex -> compOpt execOpt
, compOpt -> regex execOpt
, execOpt -> regex compOpt
class RegexOptions regex compOpt execOpt
=> RegexMaker regex compOpt execOpt source
| regex -> compOpt execOpt
, compOpt -> regex execOpt
, execOpt -> regex compOpt
where
makeRegex :: source -> regex
makeRegexOpts :: compOpt -> execOpt -> source -> regex
所有這些類的有效實例(例如,regex=Regex
,compOpt=CompOption
,execOpt=ExecOption
,和source=String
)意味着它是可以從某種形式source
編譯regex
與compOpt,execOpt
選項。 (此外,由於一些regex
類型,恰好有一個compOpt,execOpt
組與它一起去。不同source
類型的很多都還可以,雖然)。
class Extract source
class Extract source
=> RegexLike regex source
class RegexLike regex source
=> RegexContext regex source target
where
match :: regex -> source -> target
matchM :: Monad m => regex -> source -> m target
所有這些類的有效實例(例如,regex=Regex
,source=String
,target=Bool
)表示有可能匹配source
和regex
以產生target
。(其他有效target
給出:S這些特定regex
和source
是Int
,MatchResult String
,MatchArray
等)
把這些結合在一起,它是很明顯,=~
和=~~
是簡單方便的功能
source1 =~ source
= match (makeRegex source) source1
source1 =~~ source
= matchM (makeRegex source) source1
=〜是多態在它的返回類型和它的參數類型中。這意味着如果你期待一個布爾值,它將返回一個布爾值。如果您期待一個字符串列表,它將返回一個捕獲列表。等等(例如,多態參數類型可以匹配字符串和字節串) – jrockway
這並不能幫助我理解上下文定義部分。 'source'應該是什麼類型的實例? – artemave