LINUX.ORG.RU

тайпкласс для спископодобных типов

 , listlike,


0

2

В хаскеле так много спископодобных типов ByteString строгие и ленивые, Text, Vector, Array, [] и может еще куча всего. А есть ли тайпкласс унифицирующий работу с последовательностями массиво-спископодобного типа ?

class ListLike (l a) where 
    take :: Int -> (l a) -> (l a)
    drop :: Int -> (l a) -> (l a)
    (!) :: (l a) -> Int -> a
    filter ....

Не знаю что еще можно включить в этот тайпкласс, filter есть в функторе, а foldl в Foldable. Такое обилие дублирующихся функций, да еще и тайпклассов со схожим назначением меня так напрягает ...

length еще должна быть в тайпклассе, я думаю. А еще вместо take и drop (либо вместе с ними, предоставив реализацию по умолчанию для take и drop) нужна

splitAt :: Int -> [a] -> ([a], [a])
Из Data.List

Вобщем, ты меня понял, лор.

s9gf4ult ★★
() автор топика

foldl в Foldable

вообще то foldr, через него ты можешь выразить все вышеперечисленные функции.

anonymous
()
Ответ на: комментарий от anonymous

вообще то foldr, через него ты можешь выразить все вышеперечисленные функции

А как же байтстринги и прочие массивы ? для них реализация через foldr будет не эффективна. Нужен тайпкласс в котором для методов предоставляется реализация по умлочанию, которую можно заменить на более эффективную

конструктор

В моноиде есть. Речь именно о методах для последовательностей.

s9gf4ult ★★
() автор топика

А есть ли тайпкласс

Ну, если забить «ListLike» в hoogle, то найдётся пакет http://hackage.haskell.org/package/ListLike. Только тот же cons будет вести себя очень по-разному для разных инстансов.

quasimoto ★★★★
()

Может, и есть. А может, нет, и тогда ты имеешь хорошую возможность сделать его самому.

Только синтаксис будет, скорее, такой:

class ListLike l where
    type Element l
    (!) :: l -> Int -> Element l
    ...

Miguel ★★★★★
()
Ответ на: комментарий от adzeitor

Т.е. там на каждый чих свой тайплкласс.

take :: CanSplitAt c i => i -> c -> c
drop :: CanSplitAt c i => i -> c -> c


...

class CanFilter f i where
filter :: (i -> Bool) -> f

...

class CanLength c len | c -> len where
    length :: c -> len
adzeitor
()
Последнее исправление: adzeitor (всего исправлений: 1)
Ответ на: комментарий от adzeitor

Даже не знаю что правильнее, в один тайпкласс запихать все методы, или по тайпклассу на метод.

s9gf4ult ★★
() автор топика
Ответ на: комментарий от Miguel

А зачем тут

type Element l

Какой профит перед

class (FoldableLL full item, Monoid full) => ListLike full item | full -> item where

? В ListLike это хорошо решено вроде бы, или с этим будут проблемы ?

s9gf4ult ★★
() автор топика
Ответ на: комментарий от anonymous

А что за тайпклассы со схожим назначением

Да хотя-бы Foldable встречается в нескольких пакетах. Где-то даже видел класс Monad :)

s9gf4ult ★★
() автор топика
Ответ на: комментарий от s9gf4ult

Какой профит перед

Да, в общем-то, однохренственно. Я имел в виду, что «class ListLike (l a)» не заработает.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.