2015-10-28 4 views
2

Я недавно преподавал себе Haskell, и одним из моих упражнений было реализовать функцию, которая принимает две функции в качестве аргументов и передает число 3 первой функции и результат второй функции. У меня больше опыта с ракеткой. Функция, которую я создал для ракетки:Haskell Функции высокого порядка. передавая две функции в качестве аргументов.

(define (nestfun3 function function2) 
    (function2 (function 3))) 

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

twice function = function . function 

Как я могу передать две функции? Я попытался

twice function = function . function 
three function = function . twice 
+1

В этом случае все, что вам нужно сделать, это перевести '(define (FOO) BAR)' в 'FOO = BAR'. –

+0

У Haskell есть специальная поддержка для этой задачи. Вы определяете свою функцию, просто говоря 'foo = (.)' – Ingo

ответ

5

прямой перевод будет:

apply3 :: Num a => (a -> b) -> (b -> c) -> c 
apply3 f g = g (f 3) 

помните: вы не хотите, чтобы просто создавать функции - вы хотите, чтобы сначала применить 3, а затем применить результат к другой функции


извините для смешивания ... это должно работать:

λ> let f = (+1) 
λ> let g = (*2) 
λ> apply3 f g 
8 
λ> apply3 g f 
7 

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

λ> let apply3 f g = g (f 3) 
λ> :t apply3 
apply3 :: Num a => (a -> t1) -> (t1 -> t) -> t 

это даст это делает вас (или вы можете использовать GHC-мод или любой другой) - Я на самом деле просто переименовал типовые параметры (те t некрасиво)

Таким образом, он должен выглядеть очень похоже на то, что вы делали в схеме

, конечно, вы можете захотеть не менять функции при переименовании: |