2011-11-25 7 views
7

Todavía estoy tratando de descifrar este código:En Haskell, ¿por qué tengo que usar el signo de dólar en este código?

import Data.Char 
groupsOf _ [] = [] 
groupsOf n xs = 
    take n xs : groupsOf n (tail xs) 

problem_8 x = maximum . map product . groupsOf 5 $ x 
main = do t <- readFile "p8.log" 
     let digits = map digitToInt $concat $ lines t 
     print $ problem_8 digits 

En problem_8 x = maximum . map product . groupsOf 5 $ x por qué no puede ser sólo groupsOf 5 x? ¿es porque x luego se expandirá a algunas otras expresiones (aquí será: digits = map digitToInt $concat $ lines t)? ¿Es este el llamado flojo (x no se expandirá ahora, pero tal vez más tarde)?

Respuesta

15

Sin la $, la precedencia se resuelve así:

maximum . map product . (groupsOf 5 x) 

Desde . (composición de función) tiene dos funciones como argumentos, y groupsOf 5 x no puede devolver una función, esto es un error.

Con la $, la precedencia se resuelve de esta manera:

(maximum . map product . groupsOf 5) x 

Esto es equivalente (a través de la composición de funciones) a:

maximum (map product (groupsOf 5 x)) 

o:

maximum $ map product $ groupsOf 5 x 

(sin embargo ensartar a lo largo de $ como este se considera un estilo pobre)

Esto no tiene nada que ver con la pereza, tenga en cuenta.

+0

Gracias. ¿A qué te refieres con: desde. (composición de funciones) toma dos funciones como argumentos,? en ". groupsOf 5", 5 se considera como una función? – osager

+0

De todos modos, excelente para señalar el hecho de que el punto está esperando una función, no una lista o cualquier tipo de datos. – osager

+0

no, '(groupsOf 5)' es una función – bdonlan

5

Como dijo un bdonlan, $ es un function application y . es functional composition.

Usa hoogle para averiguar qué están haciendo algunas palabras clave. También podría ser útil mostrar la firma de la función y el nombre del módulo de dónde proviene.

+0

"Aplicación de función" hace que suene bastante elegante ...de hecho, es solo la función de identidad, especializada para tipos de funciones. – Prateek

8

Usted no tiene que uso $, de hecho, nunca se tiene que usarlo.

En su caso, el sentido^H^H^H^notación Hsfree sugiere en sí: en lugar de

problem_8 x = maximum . map product . groupsOf 5 $ x 

lo que equivale a:

problem_8 x = (maximum . map product . groupsOf 5) x 

podemos dejar de lado el x en ambos lados de la ecuación:

problem_8 = maximum . map product . groupsOf 5 
+1

¡Yay, reducción de eta! [hlint] (http://hackage.haskell.org/package/hlint) es muy recomendable para tales sugerencias. –

+0

Hay algunos casos donde usar '$' es la única forma de hacer algo: como cuando lo pasa a una función de orden superior. –

Cuestiones relacionadas