J'essaie de définir n'importe quelle fonction simple qui s'étend sur plusieurs lignes dans ghci, prenons l'exemple suivant:
let abs n | n >= 0 = n
| otherwise = -n
Jusqu'à présent, j'ai essayé d'appuyer sur Entrée après la première ligne:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
J'ai également essayé d'utiliser les commandes :{
et :}
mais je ne vais pas loin:
Prelude> :{
unknown command ':{'
use :? for help.
J'utilise GHC Interactive version 6.6 pour Haskell 98 sous Linux, que me manque-t-il?
:{
,:}
.Réponses:
Pour les gardes (comme votre exemple), vous pouvez simplement les mettre tous sur une seule ligne et cela fonctionne (les gardes ne se soucient pas de l'espacement)
Si vous vouliez écrire votre fonction avec plusieurs définitions dont le modèle correspond aux arguments, comme ceci:
Ensuite, vous utiliseriez des accolades avec des points-virgules séparant les définitions
la source
GHCi dispose désormais d'un mode d'entrée multiligne, activé avec: set + m. Par exemple,
la source
ghci
se comporter un peu comme l'interpréteur Python à cet égard. Très pratique! Vous pouvez en effet créer un.ghci
fichier dans votre répertoire personnel dans lequel vous le mettez:set +m
et le mode multiligne deviendra la valeur par défaut à chaque démarrageghci
!:set prompt "λ "
les lignes continues, ditesPrelude
au lieu deλ
. Un moyen de contourner cela?let
. Tapez simplement alet
suivi d'une nouvelle ligne:let
⏎. Puisfac 0 = 1
⏎. Puisfac n = n * fac (n-1)
⏎ ⏎ et vous avez terminé!Dan est correct, mais
:{
et:}
doit chaque apparaître sur leur propre ligne:Cela interagit également avec la règle de mise en page, donc lorsque vous utilisez la notation do, il peut être plus facile d'utiliser explicitement des accolades et des points-virgules. Par exemple, cette définition échoue:
Mais cela fonctionne lorsque des accolades et des points-virgules sont ajoutés:
Cela n'a vraiment d'importance que lors du collage de définitions à partir d'un fichier, où l'indentation peut changer.
la source
Il ressemble à
:{
et:}
sont une caractéristique assez nouvelle. Vous devrez peut-être mettre à niveau GHC.Edit: confirmé, voir http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html
la source
Si vous ne souhaitez pas mettre à niveau GHC uniquement pour
:{
et:}
, vous devrez tout écrire sur une seule ligne:Je ne connais aucune définition unique dans Haskell qui doit être écrite sur plusieurs lignes. Ce qui précède fonctionne en effet dans GHCi:
Pour les autres expressions, telles que les
do
blocs, vous devrez utiliser la syntaxe sans mise en page avec des accolades et des points-virgules (eugh).la source
J'utilise GHCi, version 8.2.1 sur macOS Catalina 10.15.2. Voici comment je mets ensemble la déclaration de type de fonction et les gardes. Notez que les barres verticales sur la gauche correspondent à plusieurs lignes GHCi.
la source
:{
et que:}
vous n'avez pas besoin de spécifierlet
avant votre déclaration de type, cela signifie que vous n'avez pas besoin d'indenter la deuxième ligne et les suivantes.Il semble que le fait de coller les deux lignes à la fois ou d'utiliser le contrôle-entrée pour chaque nouvelle ligne garde tout ensemble, au moins à https://repl.it/languages/haskell . Vous verrez 2 points au début de la deuxième ligne. Ou placez-le dans un fichier et: chargez le fichier (: l main). Comment se fait-il que les abdominaux ne fonctionnent pas avec des nombres négatifs? Oh, vous devez mettre des parenthèses autour du nombre.
la source