Haskell:可怕的签名

时间:2010-03-09 11:51:19

标签: haskell

我很难理解这种类型的签名:

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应该是实例,但语义看起来完全是神秘的(也就是说,我无法复制它,即使我明白它的内容。)

2 个答案:

答案 0 :(得分:4)

这里没有什么奇怪的事情:只是一些带有很多参数的类型类。 (长Text.Regex.Base...个模块名称也无济于事。)

  • 必须有Regex个实例:CompOptionExecOptionsource以及任何类型Regex
  • source1必须有RegexMaker个实例,target类型,(=~)类型
  • source1函数本身需要sourcetarget并提供(+)

Haskell自己的(=~)运算符与(+) :: Num a => a -> a -> a 的形状类似,但希望它的类型更容易理解:

{{1}}

答案 1 :(得分:3)

我在another answer中写了一篇关于Text.Regex类型类的详尽描述。

复制大部分内容......


所有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

要使用=~,LHS必须存在RegexMaker ...的实例,RHS和结果必须存在RegexContext ...

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=ExecOptionsource=String)表示可以编译regex来自某种形式compOpt,execOpt的{​​{1}}个选项。 (另外,给定一些source类型,只有一个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=Boolsource产生regex。 (给定这些特定targettarget的其他有效regexsourceIntMatchResult String等。

将这些放在一起很明显,MatchArray=~只是便利功能

=~~