У меня возникли проблемы с пониманием того, почему следующий код приводит к ошибке. Если второе поле Foo
изменяется на тип Int
, код запускается без ошибок.
Prelude> data Foo = Foo {foo_a :: Int, foo_b :: Float}
Prelude> let x = Foo 2 3.4
Prelude> unwords $ map (\fn -> (show . fn) x) [foo_a, foo_b]
<interactive>:4:46:
Couldn't match type `Float' with `Int'
Expected type: Foo -> Int
Actual type: Foo -> Float
In the expression: foo_b
In the second argument of `map', namely `[foo_a, foo_b]'
In the second argument of `($)', namely
`map (\ fn -> (show . fn) x) [foo_a, foo_b]'
Почему show
не может принимать аргументы разных типов? Следующие, конечно же, работают:
Prelude> show $ foo_a x
"2"
Prelude> show $ foo_b x
"3.4"
Кроме того, учитывая, что это не сработает, каков рекомендуемый способ применения show
к различным полям типа данных?
Спасибо.