LINUX.ORG.RU

История изменений

Исправление 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 и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно (в т.ч. не нужно объявлять инстансов). Примерно то же будет и со свёрткой если (у меня) не возникнет дополнительных трудностей с ограничениями для типа на свёртку.

ОБН. Т.е. чтобы вычислить длину любого такого списка, нужно создать список и вызвать к нему 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
т.е. получается некоторая рекурсия по типу. Но вот так определена функция len и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно (в т.ч. не нужно объявлять инстансов). Примерно то же будет и со свёрткой если (у меня) не возникнет дополнительных трудностей с ограничениями для типа на свёртку.

Исправление 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 и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно (в т.ч. не нужно объявлять инстансов). Примерно то же будет и со свёрткой если не возникнет дополнительных трудностей с ограничениями для типа на свёртку.

Исправление 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 и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно. Примерно то же будет и со свёрткой если не возникнет дополнительных трудностей с ограничениями для типа на свёртку.

Исправление 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 и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно. Примерно то же будет и со свёрткой если не возникнет дополнительных трудностей с ограничениями для типа на свёртку.

Исходная версия 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 и ты можешь её использовать для любого такого «списка». Т.е. дополнительных определений не нужно. Примерно то же будет и со свёрткой если не возникнет дополнительных трудностей с ограничениями для типа на свёртку.