有时我有两种形式的功能:
f :: a -> (b1,b2)
h :: b1 -> b2 -> c
Run Code Online (Sandbox Code Playgroud)
我需要组合物g.我通过将h改为h'来解决这个问题:
h' :: (b1,b2) -> c
Run Code Online (Sandbox Code Playgroud)
你能告诉我(如果可能的话)一个函数m,这样:
(h . m . f) == (h' . f)
Run Code Online (Sandbox Code Playgroud)
或者另一种处理这种情况的方法.谢谢.
我理解没有"位置"参数,因为所有函数只接受一个变量并返回一个函数来操作剩余的参数,但这就是我想要做的意思:
从一些函数开始,我用来格式化带有前置项,分隔符和结束项的列表.
Prelude> formatList start end sep xs = start ++ (intercalate . separator ( map show xs )) ++ end
Run Code Online (Sandbox Code Playgroud)
像这样工作:
Prelude Data.List> formatList "(" ")" "," [1..10]
"(1,2,3,4,5,6,7,8,9,10)"
Run Code Online (Sandbox Code Playgroud)
很酷,同样的想法可以用于xml标签:
Prelude Data.List> formatList "<meow>" "</meow>" "" [1..10]
"<meow>12345678910</meow>"
Run Code Online (Sandbox Code Playgroud)
本着重用函数和简洁性的精神,让我们也做到这一点,我们不必通过创建一个函数来生成打开和关闭单词"tag",从而输入meow标记的冗余部分.
Prelude Data.List> tagger tag item = "<" ++ tag ++ ">" ++ item ++ "</" ++ tag ++ ">"
Prelude Data.List> tagger "div" "contents"
"<div>contents</div>"
Run Code Online (Sandbox Code Playgroud)
所以现在制作一些标签制作器,它将返回一个开始和结束我可以为我的formatList函数创建第二个参数:
Prelude Data.List> tagMaker tag = ("<" ++ tag ++ ">", "</" ++ tag ++ …Run Code Online (Sandbox Code Playgroud)