1

当我知道所需功能的类型但尚未定义时,我应该如何处理情况?我怀疑我正在寻找的功能很容易与其他人组合,但我不知道从哪里开始寻找。

Prelude> :hoogle (b->b->c)->(a->b)->(a->b)->a->a->c
No results found

更具体地说,我(b->b->c)手头有功能,但我需要先处理(也许是提升?)参数。hoogle 可以找到具有与指定顺序不同的参数的函数吗?

这接近我需要的,但我想对每个参数应用不同的函数。

Prelude Data.Function> :t on
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
4

2 回答 2

2

看到您的问题询问此功能如何由其他功能组成,我想指出您可以将其写为:

import Control.Arrow
on2 :: (b -> b -> c) -> (a -> b) -> (a -> b) -> a -> a -> c
on2 f g h = curry (uncurry f . (g *** h))

但是,对于不习惯使用 Arrows 的人来说,bheklilr 建议的直接定义显然同样简洁且更具可读性。

而且,是的,据我所知,Hoogle也会搜索您指定的参数类型的顺序被置换的函数。

于 2013-11-29T22:23:43.510 回答
1

如果您在 hoogle 上没有找到它,则它可能尚未定义。随意将自己定义为

on2 :: (b1 -> b2 -> c) -> (a1 -> b1) -> (a2 -> b2) -> a1 -> a2 -> c
on2 f p1 p2 a1 a2 = f (p1 a1) (p2 a2)

但这会导致类似的表达

on2 zip init tail xs ys

而不仅仅是

zip (init xs) (tail ys)

所以我不知道它是否真的会为你节省很多空间。

于 2013-11-29T22:00:28.337 回答