2016-09-22 6 views
3

Как написать лучшую запись типа сигнатуры в Haskell, которая наилучшим образом инкапсулирует идею о том, что функции нужно передать кортеж любой длины со всеми элементами X и список кортежей (одной длины) со всеми элементами Y?Тип безопасного размера одинакового кортежа.

Я не возражаю, если переданный тип является «реальным» кортежем некоторого альтернативного типа данных, если я могу обеспечить во время компиляции, что и кортеж, и список кортежей имеют одинаковую длину.

Tuple N X -> [Tuple N Y] -> Z 
+2

Длинного выстрел, но вы могли бы использовать DataKinds для создания собственных «векторов длиной индексированных», а затем использовать их, чтобы ограничить ваши параметры функции? https://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/promotion.html – zoran119

+0

Или используйте это: https://hackage.haskell.org/package/fixed-list-0.1.6 /docs/Data-FixedList.html – zoran119

+0

Я подозреваю, что ни один из двух выше не достаточно общий :( – zoran119

ответ

4

Как предлагает zoran119, векторы с индексом длины - это классический способ сделать это.

{-# LANGUAGE GADTs, DataKinds #-} 

data Nat = Z | S Nat 

data Vec n a where 
    Nil :: Vec 'Z a 
    Cons :: a -> Vec n a -> Vec ('S n) a 

Теперь вы можете легко написать

f :: Vec n X -> [Vec n Y] -> Z 
Смежные вопросы