2015-03-21 4 views
1

Предположим, у меня есть v, который равен Applicative, а также Traversable. Как я могу получить v с индексами v? Для конкретного примера рассмотрим V3 от Linear. Я хочу V3 0 1 2.Получить индексы Аппликативного траверса без манекена

Один из способов заключается в использовании mapAccumL с соской, например:

snd $ T.mapAccumL 
    (\idx _ -> (idx + 1, idx)) 
    0 (pure "") :: V3 Int 

Но (pure "") манекен чувствует себя безвкусный. Как мы можем сделать это более элегантно?

+1

Релевантно: [Как использовать объектив в Haskell для дублирования «перечисления» Python?] (Http://stackoverflow.com/questions/29125149/how -would-i-use-lens-in-haskell-to-duplicate-pythons-enumerate) – dfeuer

+4

В чем дело с пустой строкой? Если вы хотите «ничего интересного» значения, канонический выбор - '()'. – dfeuer

+0

Ссылка post @dfeuer содержит несколько хороших альтернативных подходов, но ни одна из них не устраняет необходимость в исходном значении, которое дает форму. (Но тогда этот вопрос не просил об этом.) –

ответ

2

Вы не собираетесь сбегать, используя pure, если вы делаете это только с Applicative и Traversable. Это единственная функция в этих классах, которая дает вам значение вашего типа без , имеющего.

Кроме того, ваш манекен определяет форму значения, которое вы создаете. Рассмотрим такой тип, как списки, где не все значения имеют одинаковую форму: как вы выбираете между построением [0], [0,1] или [0,1,2]? (A pure) дает вам первый вариант.)