我很难理解这种类型的签名:
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
我认为他们列出了类型类,source
,source1
和target
应该是实例,但语义看起来完全是神秘的(也就是说,我无法复制它,即使我明白它的内容。)
答案 0 :(得分:4)
这里没有什么奇怪的事情:只是一些带有很多参数的类型类。 (长Text.Regex.Base...
个模块名称也无济于事。)
Regex
个实例:CompOption
,ExecOption
,source
以及任何类型Regex
source1
必须有RegexMaker
个实例,target
类型,(=~)
类型source1
函数本身需要source
和target
并提供(+)
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=Regex
,compOpt=CompOption
,execOpt=ExecOption
和source=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=Regex
,source=String
)表示可以匹配target=Bool
和source
产生regex
。 (给定这些特定target
和target
的其他有效regex
为source
,Int
,MatchResult String
等。
将这些放在一起很明显,MatchArray
和=~
只是便利功能
=~~