2010-03-09 119 views
4

我努力理解這種類型的簽名:哈斯克爾:恐怖類型簽名

Prelude Text.Regex.Posix> :t (=~) 
(=~) 
    :: (Text.Regex.Base.RegexLike.RegexMaker 
     Regex CompOption ExecOption source, 
     Text.Regex.Base.RegexLike.RegexContext Regex source1 target) => 
    source1 -> source -> target 

我估計他們列出類型類,sourcesource1target應的實例,但語義看起來完全晦澀難懂的(即是的,即使我理解它所說的話,我也無法複製它)。

+0

=〜是多態在它的返回類型和它的參數類型中。這意味着如果你期待一個布爾值,它將返回一個布爾值。如果您期待一個字符串列表,它將返回一個捕獲列表。等等(例如,多態參數類型可以匹配字符串和字節串) – jrockway

+1

這並不能幫助我理解上下文定義部分。 'source'應該是什麼類型的實例? – artemave

回答

4

這裏沒有什麼奇怪的事情:只是一些有很多參數的類型類。 (長Text.Regex.Base...模塊名稱沒有幫助,無論是。)

  • 必須有一個RegexMaker實例:RegexCompOptionExecOption,和任何類型source
  • 必須有一個RegexContext實例: Regex,無論何種類型source1是,和任何類型target
  • (=~)功能本身需要一個source1source並給出了一個target

Haskell的自己(+)運營商是一個形狀類似於(=~),但它的類型是希望更容易閱讀:

(+) :: Num a => a -> a -> a 
+0

我不明白。也許我太小白了。目前我正處於本章的中間:http://book.realworldhaskell.org/read/efficient-file-processing-regular-expressions-and-file-name-matching.html – artemave

+0

你知道如何使用類型類本身?也就是說,你是否知道我的'(+)'類型中'Num a'的重要性? –

+0

是的,這個我明白 – artemave

3

我寫的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=RegexcompOpt=CompOptionexecOpt=ExecOption,和source=String)意味着它是可以從某種形式source編譯regexcompOpt,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=Regexsource=String,target=Bool)表示有可能匹配sourceregex以產生target。(其他有效target給出:S這些特定regexsourceIntMatchResult StringMatchArray等)

把這些結合在一起,它是很明顯,=~=~~是簡單方便的功能

source1 =~ source 
    = match (makeRegex source) source1 
source1 =~~ source 
    = matchM (makeRegex source) source1