Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для Albey
6 / 6 / 0
Регистрация: 10.12.2019
Сообщений: 10
1

Векторы фиксированной на уровне типа длины

12.10.2023, 17:16. Показов 883. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста в следующем вопросе - есть векторы фиксированной на уровне типа длины. Для указания длины вектора используются числа Пеано:

Haskell
1
2
3
4
5
6
7
8
9
10
{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE StandaloneDeriving  #-}
{-# LANGUAGE KindSignatures      #-}
 
data Peano = Z | S Peano deriving Show
data Vec (n :: Peano) a where VNil :: Vec 'Z a
                                VCons :: a -> Vec n a -> Vec ('S n) a
infixr 5 `VCons`
deriving instance Show a => Show (Vec n a)
Необходимо создать функцию, которая на основании списка значений создавала бы соответствующий экземпляр вектора фиксированной длины (равной длине списка). Это легко сделать явным перечислением, например:

zz [x1,x2,x3,x4,x5] = x1 `VCons` (x2 `VCons` (x3 `VCons` (x4 `VCons` (x5 `VCons` VNil))))

Но как это сделать для списка произвольной длины?
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2023, 17:16
Ответы с готовыми решениями:

Как в C# задать переменную типа string фиксированной длины?
как в C# задать переменную типа string фиксированной длины? В vb это делается так: st As String *...

Заданы векторы x={xn} и y={yn} . Найти их длины. Определить ортогональны ли эти векторы
Заданы векторы x={xn} и y={yn} . Найти их длины. Определить ортогональны ли эти векторы. Исходные...

Строку произвольной длины разрезать на несколько строк фиксированной длины
Есть строка большой длины (до 2000 символов) - последние символы в строке ~^, нужно разделить эту...

Есть ли у кого похожий алгоритм: распределения отрезков разной длины внутри отрезков фиксированной длины?
Народ помогите мне с программой распределения отрезков разной длины внутри отрезков фиксированной...

Массивы фиксированной длины
Что это такое: typedef uint8_t esp_bd_addr_t; Потом оно используется так: struct...

1
238 / 187 / 32
Регистрация: 02.07.2020
Сообщений: 141
12.10.2023, 21:26 2
Лучший ответ Сообщение было отмечено Albey как решение

Решение

Ответ "никак" вас устроит?
Тип вектора зависит от длины списка, и этот тип должен быть известен на этапе компиляции.
Но длина произвольного списка известна только в рантайме, и тип в Haskell не может зависить от такого значения.

Даже в языках с зависимыми типами, где это возможно, сигнатура у такой функции будет сложнее чем просто [a] -> Vec n a,
потому, что нам неоткуда взять эту n на уровне типа.
Например, в idris (там Vec и Peano называются Vect и Nat, соответственно) это может быть
Код
listToVect : List a -> DPair Nat (\n => Vect n a)
или
Код
listToVect : (xs : List a) -> Vect (length xs) a
Но такая гибкость в Haskell недоступна, хоть подвижки в эту сторону есть. Может быть когда-нибудь...

Есть несколько вариантов полумер разной степени пригодности.
Думаю, из того, что вам более менее подойдет, будет что-то такое
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{-# LANGUAGE Haskell2010         #-}
{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE StandaloneDeriving  #-}
{-# LANGUAGE KindSignatures      #-}
 
import Data.Proxy
import GHC.TypeLits
 
data Peano = Z | S Peano deriving Show
data Vec (n :: Peano) a where
  VNil :: Vec 'Z a
  VCons :: a -> Vec n a -> Vec ('S n) a
infixr 5 `VCons`
deriving instance Show a => Show (Vec n a)
 
class ListToVec (n :: Peano) where
  listToVec :: [a] -> Maybe (Vec n a)
 
instance ListToVec Z where
  listToVec [] = Just VNil
  listToVec (x:xs) = Nothing
 
instance ListToVec n => ListToVec (S n) where
  listToVec [] = Nothing
  listToVec (x:xs) = VCons x <$> listToVec xs
 
main :: IO ()
main = do
  print $ (listToVec []      :: Maybe (Vec Z Int))             -- Just VNil
  print $ (listToVec [1,2,3] :: Maybe (Vec (S (S (S Z))) Int)) -- Just (VCons 1 (VCons 2 (VCons 3 VNil)))
  print $ (listToVec [1,2]   :: Maybe (Vec (S (S (S Z))) Int)) -- Nothing
  print $ (listToVec [1,2,3] :: Maybe (Vec (S (S Z)) Int))     -- Nothing
Т.е. зная ожидаемую длину вектора, мы можем конвертировать список этой длины в вектор.
Если длина не совпадет - будет Nothing
4
12.10.2023, 21:26
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2023, 21:26
Помогаю со студенческими работами здесь

Объявление строки фиксированной длины
Всем здравствуйте. struct ConfigItem { bool bVisible; String Caption; float val;...

Числовые типы фиксированной длины
Для того, чтобы типы везде имели одинаковый размер, существует uint8_t, uint16_t, uint32_t и...

Динамический массив строк фиксированной длины
Добрый день! Помогите осилить простую задачу: Нужен массив переменного размера строк...

Дополнить определённые строки до фиксированной длины
Задание: Написать сценарий, который будет читать текст из заданного файла и выводить построчно на...

Сообщения фиксированной длины через COM порт
Нужно опрашивать прибор по COM порту. Протокол RS232. Я бы мог спросить в других ветках, суть одна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
Rust или Go? А может C++?
hw_wired 28.01.2025
С каждой новой технологией или методологией появляются новые языки программирования, призванные решать конкретные задачи либо улучшать аспекты производительности и безопасности. Среди множества. . .
Fortran и WinAPI: как создать приложение с графическим интерфейсом
hw_wired 28.01.2025
Fortran — это один из старейших высокоуровневых языков программирования, широко используемый в науке и инженерии уже несколько десятилетий. Его название происходит от "Formula Translation" (перевод. . .
Списки в Haskell
hw_wired 28.01.2025
Haskell является функциональным языком программирования, который отличается лаконичностью синтаксиса и мощными абстракциями. Важным концептом в Haskell являются списки — упорядоченные коллекции. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru