Я пытаюсь изучить классы типов в haskell. Я пишу следующий скрипт и поднял ошибку. Я не могу понять, почему компилятор думает о v как конкретный тип, в то время как это просто параметр для класса Boxer.Почему компилятор дает ошибку на следующий код haskell?
data Box1 a b = Box1 Double a [b]
class Boxer v where
foo :: (v a b) -> Double
instance Boxer (Box1 a b) where
foo (Box1 r s t) = r
он выдает ошибку в строке 7: 8:
Couldn't match type `v' with `Box1'
`v' is a rigid type variable bound by
the type signature for foo :: v a b -> Double at file1.hs:4:10
Expected type: v a b
Actual type: Box1 a b
Relevant bindings include
foo :: v a b -> Double (bound at file1.hs:7:3)
In the pattern: Box1 r s t
In an equation for `foo': foo (Box1 r s t) = r
Failed, modules loaded: none.
В этом случае ошибка, вероятно, связано с углублением - 'декларация Foo' не связана с класса' Boxer', поэтому он ожидает функцию типа 'ForAll против A B. v a b -> Double'. Кроме того, 'instance Boxer (Box1 a b)' неверен - это должен быть «экземпляр Boxer Box1». Первая будет ошибкой типа, если функция 'foo' была правильно связана с классом« Боксер ». – user2407038
@ пользователь2407038 большое спасибо. Это была действительно ошибка из-за отступов. Но не могли бы вы объяснить, когда я создаю экземпляр Foldable, там компилятор не позволяет мне делать экземпляр Foldable Box1. Он просит добавить больше параметров в Box1. –
Вам нужно будет написать 'instance Foldable (Box1 a)' - класс 'Foldable' принимает параметр вида' * -> * ', тогда как тип' Box1' - '* -> * -> *'. – user2407038