2013-08-08 3 views
1

У меня есть следующий простой код:Представление данных в виде строки

data Shape = Circle Float Float Float | Rectangle Float Float Float Float deriving (Show) 
surface :: Shape -> Float 
surface (Circle _ _ r) = pi * r^2 

main = putStrLn $ surface $ Circle 10 20 30 

Он жалуется:

Couldn't match expected type `String' with actual type `Float' 
In the second argument of `($)', namely `surface $ Circle 10 20 30' 

Как избавиться от ошибки? Я также хотел бы добавить «show» к Shape и переопределить его так, чтобы я мог отображать Shape на экране (распечатано), что бы я ни захотел.

+2

BTW вы должны лучше использовать синтаксис записи здесь, например, 'Circle {circleX, circleY, circleRadius :: Float}'. – Landei

ответ

4

Вы должны добавить шоу:

main = putStrLn $ show $ surface $ Circle 10 20 30 

Если вы хотите иметь свой собственный метод Show, не получают Показать:

data Shape = Circle Float Float Float 
      | Rectangle Float Float Float Float 

instance Show Shape where 
    show (Circle _ _ r) = show r 
    show (Rectangle r _ _ _) = show r 

main = putStrLn $ show $ Circle 10 20 30 
+0

Как переопределить шоу в форме? –

+0

Отредактированное решение, чтобы показать, как это сделать. – seanmcl

+0

Обратите внимание, что использование печати аналогично использованию putStrLn. показать –