2017-07-16 7 views
2

Je lis la programmation en Haskell par Graham Hutton et donne le code suivant au chapitre 13:Syntaxe de l'endroit où le bloc

import Control.Applicative 
import Data.Char 

{- some code omitted -} 

newtype Parser a = P (String -> [(a, String)]) 

item :: Parser Char 
item = P (\ input -> case input of 
        [] -> [] 
        x:xs -> [(x,xs)]) 

three :: Parser (Char,Char) 
three = pure g <*> item <*> item <*> item 
     where g a b c = (a,c) 

Je vais avoir du mal à comprendre la dernière ligne

where g a b c = (a,c) 

Je comprends que cette ligne existe parce que trois ont type Parser (Char, Char) mais que représente gabc? Comment g a b c est-il syntaxiquement valide? Je suis habitué à voir où dans des cas comme

f :: s -> (a,s) 
f x = y 
    where y = ... x ... 

où apparaissent chaque symbole x et y avant la déclaration où.

Répondre

9

C'est la syntaxe pour déclarer une fonction. Il est l'équivalent de

where g = \a b c -> (a,c) 

g est une fonction qui prend 3 arguments et retourne un tuple

2

Comment est g a b c syntaxiquement valide?

Pour la même raison, la même définition au niveau supérieur du module serait valide. La différence entre les définitions dans where et le niveau supérieur est juste que vous avez des variables liées dans la tête de la fonction (par exemple x dans votre dernier exemple) dans la portée et peut les utiliser sur le côté droit, mais cela ne signifie pas d'utiliser à utiliser leur.