как записать возврату Haskell

Я хочу свое showStackHead функциональное взятие печать стека голова и возвращаю отдых, вот мой код - код

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

когда я выполняю этот код, компилятор говорит мне, что существует ошибка анализа приблизительно второй возврат, поэтому что правильный путь состоит в том, чтобы записать этой функции?

5
задан Don Stewart 20 April 2011 в 04:36
поделиться

2 ответа

Отступите 'return' на ту же глубину, что и 'putStrLn', примерно так:

showStackHead xs
   | xs == []   = return []
   | otherwise  = do putStrLn ("result:" ++ (head xs))
                     return (tail xs)
15
ответ дан 18 December 2019 в 09:47
поделиться

Кстати, ваш showStackHead может быть чище, если использовать сопоставление с образцом. Позволяя вам отказаться от сравнения охраны, голова и хвост:

#! /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
2
ответ дан 18 December 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: