J'ai une question très simple. J'aimerais utiliser une clause WHERE après un bloc de code qui utilise des opérateurs de liaison, mais je reçois une erreur de compilation.
Voici un exemple simple: p>
main = do putStrLn "where clause test:" list <- return [1..10] print list' where list' = reverse list --test3.hs:5:30: Not in scope: `list'
3 Réponses :
Autant que je puisse dire, la clause WHERE n'est utilisée que dans les liaisons locales em>. La partie interne d'un >> (=) instruction de liaison n'est pas une liaison locale (deux types différents de liaisons dans cette phrase).
comparer avec ceci: p> Vous voudrez peut-être vous référer au Signaler Haskell 98 Syntaxe - Je ne sais pas combien Aidez-y. P> Si je me trompe, quelqu'un me corrigera certainement, mais je suis sûr que vous ne pouvez pas utiliser une clause de l'endroit du tout dans le style que vous avez montré ci-dessus. LISTE CODE> NE SERA JAMAIS UN PLANCE D'UNE CLAUSE SIZ-VOUS Sauf si c'est un paramètre de la fonction. p> p>
Une abstraction Lambda est une expression, pas une déclaration ou une liaison, bien qu'elle puisse lier de nouveaux noms ...
Whoa, qui -1'ed ça? Je pense que c'est correct, sinon aussi complet que possible.
Ce n'est pas pertinent. L'OP veut utiliser "liste", résultant du milieu d'un tas de calculs monadiques; pas une valeur qui vient de l'extérieur de la monade
Le problème est que du Rapport HASKELL 98 sur Déclarations et liaisons , P> p em> | g 1 sub> em> est le sucre pour p> p em> ou, simplifiant les choses en supprimant les gardes, P> p em> est le sucre pour p> p em> dans les liaisons de fonction et de motif. Ceci est vrai même lorsque votre e em> est un Si vous voulez avoir une contraignante local à une subexpression particulière dans une expression plus grande, vous devez utiliser Vous ne pouvez même pas écrire p> parce que " e em> ceci est légal (si quelque peu conçu). P> P> let code> -
dans code> est une expression qui peut être utilisée dans d'autres expressions, tandis que
où code> ne peut être utilisé que sur A (Module | CLASSE DE LA CLASSE | GADT | ...) DÉCLARATION OU A (FONCTION | MOTIF) Reliure.
= code> e 1 SUB> em>
| g 2 sub> em> = code> e 2 sud> em>
...
| g m sub> em> = code> e m sub> em>
où { code> déclins em>
} code> p>
blockQuote>
= let code> déclins em>
dans code>
si code> g 1 sub> em>
alors code> e 1 second> em>
sinon code>
si code> g 2 sub> em>
(code> e 2 em> em>
sinon code>
...
si code> g m sub> em>
alors code> e m sub> em>
sinon erreur "modèle inégalé" code> p>
blockQuote>
= code> e em>
où { code> déclenche em>
} Code> p>
blockQuote>
= let code> déclenche em>
dans code> e em> p> p> p> p> P>
BlockQuote>
do { code> ...
} code> construction. P>
laisser code> -
dans code> (ou simplement
laisser code> à l'intérieur d'un
faire code>, mais ce n'est que du sucre pour
let code> -
dans code>). p>
où { code> déclins em>
} code>" n'est pas une expression légale -
où code> ne peut être utilisé que dans les déclarations et les liaisons. p>
Pourquoi pas seulement "Let List '= Reverse List"? Dans le dernier exemple?
Merci, je devrais faire référence au rapport Haskell plus souvent lorsque j'ai des questions fondamentales sur la langue telle que celle-ci.
@NewacCT: la question de l'OP comprend déjà cette variante, qui fonctionne évidemment.
Comme éphémique explique, vous ne pouvez pas utiliser L'erreur se produit car dans ce code: P> où code> clause comme vous le faites.
main = do
list <- return [1..10]
let list' = f list
print list'
where
f list = reverse list -- Consider renaming list,
-- or writing in point-free style
Merci, votre exemple avec plus de parenthèses l'effache pour moi.