Я новичок в Haskell, я искал ответ на нижеследующий, но не повезло.Haskell - Объединение типов данных?
Почему этот код не компилируется?
newtype Name = Name String deriving (Show, Read)
newtype Age = Age Int deriving (Show, Read)
newtype Height = Height Int deriving (Show, Read)
data User = Person Name Age Height deriving (Show, Read)
data Characteristics a b c = Characteristics a b c
exampleFunction :: Characteristics a b c -> User
exampleFunction (Characteristics a b c) = (Person (Name a) (Age b) (Height c))
Ошибка:
"Couldn't match expected type ‘String’ with actual type ‘a’,‘a’ is a rigid type, variable bound by the type signature"
Однако это компилируется нормально:
exampleFunction :: String -> Int -> Int -> User
exampleFunction a b c = (Person (Name a) (Age b) (Height c))
Я понимаю, что есть более простые способы сделать выше, но я просто тестирования различных видов использования пользовательские типы данных.
Update:
Моя склонность является то, что компилятор не нравится 'exampleFunction :: Характеристики A B C', потому что его не типобезопасен. то есть я не гарантирую: a == Имя строки, b == Возраст, c == Высота Int.
Спасибо, я просто обновил свой вопрос в то же время с почти так: р –