2013-08-02 12 views
1

В чем проблема?Что вызывает ошибку синтаксического анализа в этой программе?

module Main 
    where 

import System.IO 

main = do 
    hSetBuffering stdin LineBuffering 
    numbers <- ask -- parse error on input `numbers' 
    putStrLn "The sum of all numbers is:" 
    putStrLn $ sum numbers 
    putStrLn "The product of all numbers is:" 
    putStrLn $ product numbers 

ask :: (Read a, Eq a, Num a) => IO [a] 
ask = do 
    putStrLn "Enter a number to add it to the list. Enter zero to terminate the list." 
    input <- getLine 
    let n = read input 
    if n == 0 
    then return [] 
    else do 
     rest <- ask 
     return (n : rest) 
+0

У вас есть символы TAB? – augustss

+0

@augustss да я –

+0

@ A.B. У вас есть смешения таблиц и пробелов? Это смутит/сломает ghc – jozefg

ответ

1

Давайте посмотрим на тип подписи putStrLn:

> :t putStrLn 
putStrLn :: String -> IO() 

Поскольку a в ask не имеет явного типа подписи, Haskell/GHC выводит его из методов, которые вы используете его.

Так как у вас есть способ putStrLn a, единственный способ, которым это возможно, - это если a :: String.

Однако, в типе подписи sum:

> :t sum 
sum :: (Num a) => [a] -> a 

a должен быть экземпляром Num класса типов. (Ваша функция ask также определяет это, также).

GHC знает, что aдолжен быть String ... но sum требует Num. String не является, по крайней мере, в прелюдии, экземпляром Num.

Здесь возникает противоречие.

Я рекомендую вам использовать программу, например ghc-mod, чтобы проверить свои программы, вы можете получить более полезные сообщения об ошибках. Вот что я получил:

No instance for (Num String) 

Это хорошо согласуется с тем, что мы заключили.

Решение в этом случае будет первым превратить ваш Num в String:

> :t show 
show :: (Show a) => a -> String 

для:

putStrLn $ show $ sum numbers 

К счастью, printStrLn . show является совмещенным, как print:

> :t print 
print :: (Show a) => a -> IO() 

поэтому вы можете использовать

print $ sum numbers 
+0

Зачем это причиной ошибки синтаксического анализа, а не ошибки типа? –

Смежные вопросы