【发布时间】:2019-10-17 12:16:58
【问题描述】:
我一直在尝试采用一些简单的函数并将它们转换为无点样式进行练习。 我从这样的事情开始:
zipSorted x y = (zip . sort) y $ sort x --zipSorted(x, y) = zip(sort(y), sort(x))
并最终将其转换为
zipSorted = flip (zip . sort) . sort
(我不确定这是否是最好的方法,但它确实有效)
现在我试图通过完全不依赖zip 和sort 来进一步减少这个表达式。换句话说,我正在寻找这个函数:(如果我的词汇没有记错的话,我认为它是一个组合子)
P(f, g, x, y) = f(g(y), g(x))
sort 出现两次但只传入一次的事实暗示我应该使用应用函子运算符<*>,但由于某种原因我不知道如何使用。
据我了解,(f <*> g)(x) = f(x, g(x)),所以我尝试以这种形式重写第一个无点表达式:
flip (zip . sort) . sort
(.) (flip $ zip . sort) sort
(flip (.)) sort $ flip (zip . sort)
(flip (.)) sort $ flip $ (zip .) sort
看来sort应该是x,(flip (.))应该是f,flip . (zip .)应该是g。
p = (flip (.)) <*> (flip . (zip .))
p sort [2, 1, 3] [4, 1, 5]
按预期产生[(1, 1), (4, 2), (5, 3)],但现在我不知道如何将zip 拉出来。我试过了
p = (flip (.)) <*> (flip . (.))
p zip sort [2, 1, 3] [4, 1, 5]
但这不起作用。有没有办法将该表达式转换为分解出zip 的组合子?
【问题讨论】:
-
稍作备份,您正在寻找
zipSorted f g = flip (f . g) . g的无点定义? -
我得到了
zipSorted的无点定义为flip (zip . sort) . sort(它的定义中没有list1或list2)但现在我试图将其分解所以它的定义中也没有zip或sort(即该函数有4 个参数:zip、sort、list1和list2) -
是的,这就是我的问题的意思;我将
zip和sort抽象为参数f和g,以便zipSorted zip sort评估为您的原始函数。 -
(我想我应该说,你想要
foo f g = flip (f . g) . g的免点版本,所以zipSorted == foo zip sort。)
标签: haskell pointfree combinators