История изменений
Исправление AndreyKl, (текущая версия) :
Если я правильно понимаю, эти «списки» разной длины будут иметь разный тип.
да, это верно.
Можно написать функцию, которая будет сворачивать такой «список» любой длины, но при этом не параметризована типом списка?
Гм, ну как не параметризована типом... в некотором смысле конечно параметризована. Ну то есть, чтобы быть конкретным, длину вычислять вероятно нужно как то так (псевдокод навскидку, вечером постараюсь набросать реальный пример , и посмотрю что со свёрткой)
class Len a where
len :: a -> Int
instance Len HNil where
len HNil = 0
instance Len (HList as) => Len (HList (a ': as)) where
len (_ ::: rest) = 1 + len rest
ОБН. Т.е. чтобы вычислить длину любого такого списка, нужно создать список и вызвать к нему len, например
xs1 = True ::: 'a' ::: "Hello" ::: HNil
xs2 = (1 :: Int) ::: (1.2 :: Float) ::: ('a', True) ::: False ::: HNil
len xs1 // вернёт 3
len xs2 // вернёт 4
Исправление AndreyKl, :
Если я правильно понимаю, эти «списки» разной длины будут иметь разный тип.
да, это верно.
Можно написать функцию, которая будет сворачивать такой «список» любой длины, но при этом не параметризована типом списка?
Гм, ну как не параметризована типом... в некотором смысле конечно параметризована. Ну то есть, чтобы быть конкретным, длину вычислять вероятно нужно как то так (псевдокод навскидку, вечером постараюсь набросать реальный пример , и посмотрю что со свёрткой)
class Len a where
len :: a -> Int
instance Len HNil where
len HNil = 0
instance Len (HList as) => Len (HList (a ': as)) where
len (_ ::: rest) = 1 + len rest
Исправление AndreyKl, :
Если я правильно понимаю, эти «списки» разной длины будут иметь разный тип.
да, это верно.
Можно написать функцию, которая будет сворачивать такой «список» любой длины, но при этом не параметризована типом списка?
Гм, ну как не параметризована типом... в некотором смысле конечно параметризована. Ну то есть, чтобы быть конкретным, длину вычислять вероятно нужно как то так (псевдокод навскидку, вечером постараюсь набросать реальный пример , и посмотрю что со свёрткой)
class Len a where
len :: a -> Int
instance Len HNil where
len HNil = 0
instance Len (HList as) => Len (HList (a ': as)) where
len (_ ::: rest) = 1 + len rest
Исправление AndreyKl, :
Если я правильно понимаю, эти «списки» разной длины будут иметь разный тип.
да, это верно.
Можно написать функцию, которая будет сворачивать такой «список» любой длины, но при этом не параметризована типом списка?
Гм, ну как не параметризована типом... в некотором смысле конечно параметризована. Ну то есть, чтобы быть конкретным, длину вычислять вероятно нужно как то так (псевдокод навскидку, вечером постараюсь набросать реальный пример , и посмотрю что со свёрткой)
class Len a where
len :: a -> Int
instance Len HNil where
len HNil = 0
instance Len (HList as) => Len (HList (a ': as)) where
len (_ ::: rest) = 1 + len rest
Исправление AndreyKl, :
Если я правильно понимаю, эти «списки» разной длины будут иметь разный тип.
да, это верно.
Можно написать функцию, которая будет сворачивать такой «список» любой длины, но при этом не параметризована типом списка?
Гм, ну как не параметризована типом... в некотором смысле конечно параметризована. Ну то есть, чтобы быть конкретным, длину вычислять вероятно нужно как то так (псевдокод навскидку, вечером постараюсь набросать реальный пример , и посмотрю что со свёрткой)
class Len a where
len :: a -> Int
instance Len HNil where
len HNil = 0
instance Len (HList as) => Len (HList (a ': as)) where
len (_ ::: rest) = 1 + len rest
Исходная версия AndreyKl, :
Если я правильно понимаю, эти «списки» разной длины будут иметь разный тип.
да, это верно.
Можно написать функцию, которая будет сворачивать такой «список» любой длины, но при этом не параметризована типом списка?
Гм, ну как не параметризована типом... в некотором смысле конечно параметризована. Ну то есть, чтобы быть конкретным, длину вычислять вероятно нужно как то так (псевдокод навскидку, вечером постараюсь набросать реальный пример , и посмотрю что со свёрткой)
class Len a where
len :: a -> Int
instance Len HNil where
len HNil = 0
instance Len (HList as) => Len (HList (a ': as)) where
len (_ ::: rest) = 1 + len rest
т.е. получается некоторая рекурсия по типу. Но вот так определена функция Len и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно. Примерно то же будет и со свёрткой если не возникнет дополнительных трудностей с ограничениями для типа на свёртку.