2013-11-29 2 views
1

Как я должен прибегать к ситуациям, когда я знаю тип необходимой функции, но еще не определен? Я подозреваю, что функция, которую я ищу, легко скомпонована у других, но я не знаю, с чего начать.Как построить «недостающие» сложные функции в Haskell

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 

ответ

2

Видя, как ваш вопрос спрашивает, как эта функция может состоять из других функций, я хотел бы отметить, что вы можете написать:

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

Однако прямолинейный определение было предложено bheklilr, очевидно, просто как сжатые и более читаемые для людей, которые не привыкли работать со стрелками.

И, да, насколько я знаю, Hoogle делает также выполняет поиск функций, в которых указан порядок заданных типов аргументов.

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) 

Так что я не знаю, если это было бы реально сэкономить вы много места.

+0

Я столкнулся с ситуациями, когда мне нужно передать специализированные функции равенства или сравнения в другие, и вот что-то вроде этого очень удобно (я фактически использовал функцию «on» .... Мне никогда не приходилось on2, но я уверен, что есть случаи). Без on2 вы должны использовать лямбду, которую мне труднее читать. – jamshidh