2010-06-28 37 views
5

Tôi muốn chức năng showStackHead tôi lấy một chồng in đầu và trả lại nghỉ, đây là mã của tôi --codelàm thế nào để viết trở Haskell

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

khi tôi chạy mã này, trình biên dịch nói với tôi có là lỗi phân tích cú pháp về lần trả lại thứ hai, vậy cách viết đúng chức năng này là gì?

Trả lời

15

Indent các 'trở lại' với cùng độ sâu là 'putStrLn', như sau:

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

đọc về "bố cục" trong hướng dẫn Haskell 98 – bandi

2

Là một sang một bên, showStackHead của bạn có thể làm sạch bằng mô hình kết hợp. Cho phép bạn bỏ qua so sánh bảo vệ, đầu và đuôi:

#! /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 
Các vấn đề liên quan