2010-03-09 77 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