¿Hay alguna manera en Haskell de enlazar el segundo argumento pero no el primero de una función sin usar funciones lambda o definir otra función "local"?¿Cómo puedo vincular el segundo argumento en una función pero no en la primera (de una manera elegante)?
Ejemplo. Tengo una función binaria como:
sub :: Int -> Int -> Int
sub x y = x - y
Ahora si quiero enlazar el primer argumento, que puede hacerlo fácilmente usando (someExpression sub):
mapSubFrom5 x = map (sub 5) x
*Main> mapSubFrom5 [1,2,3,4,5]
[4,3,2,1,0]
Eso funciona bien si quiero unir los primeros n argumentos sin "gap".
Si quiero enlazar el segundo argumento, pero no el primero, las dos opciones que conozco son más detallado:
O a través de otro, local, función:
mapSub5 x = map sub5 x
where sub5 x = sub x 5
*Main> mapSub5 [1,2,3,4,5]
[-4,-3,-2,-1,0]
O usando lambda :
mapSub5 x = map (\x -> sub x 5) x
Mientras que ambos están trabajando muy bien, me gusta la elegancia del "sub 5" y se preguntan si hay una manera elegante de manera similar a obligar a la enésima (n> 1) argumento de una función?
Como '-5' es un número, los fabricantes de haskell incluso agregaron una función de 'restar' que se define como' restar = voltear (-) 'para que pueda escribir' mapa (restar 5) '. Sin embargo, es más legible. – fuz
Además, un corolario de la nota final: si a menudo desea aplicar parcialmente argumentos posteriores a una función que usted mismo escribió, ¡no dude en cambiar el orden directamente! Es relativamente raro que una función tenga tres o más argumentos que es probable que se usen de esa manera. –