2010-06-28 5 views
5

Je veux que ma fonction showStackHead prendre une pile imprimer la tête et le retour des restes, voici mon code --Codecomment écrire revenir Haskell

showStackHead xx 
       | xx == [] = return [] 
       | otherwise = do putStrLn("result:" ++ (head xx)) 
           return (tail xx) 

quand je lance ce code, le compilateur me dit qu'il est une erreur d'analyse sur le second retour, alors quelle est la bonne façon d'écrire cette fonction?

Répondre

15

le retrait « retour » à la même profondeur que « putStrLn », comme ceci:

showStackHead xs 
    | xs == [] = return [] 
    | otherwise = do putStrLn ("result:" ++ (head xs)) 
        return (tail xs) 
+3

lire à propos de "layout" dans le tutoriel Haskell 98 – bandi

2

En aparté, votre showStackHead pourrait être plus propre en utilisant la recherche de motifs. Vous permettant d'abandonner la comparaison de garde, tête et queue:

#! /usr/bin/env runhaskell 


showStackHead []  = return [] 
showStackHead (x:xs) = do 
    putStrLn $ "result: " ++ [x] 
    return xs 


main :: IO() 
main = do 
    let s1 = [] 
    r1 <- showStackHead s1 
    putStrLn $ "returned: " ++ r1 

    putStrLn "---" 

    let s2 = "foo" 
    r2 <- showStackHead s2 
    putStrLn $ "returned: " ++ r2 

    putStrLn "---" 

    let s3 = "q" 
    r3 <- showStackHead s3 
    putStrLn $ "returned: " ++ r3