2016-12-15 19 views
1

У меня есть функция a -> [b], и я ищу функцию, которая преобразует ее в аналогичную функцию, но с элементами списка, которые обертываются в некоторый newtype/data: a -> [t b]. Поэтому мне нужно найти функцию, которая выполняет следующие функции: (a -> [b]) -> (a -> [t b]).Обернуть вывод функции в новый тип данных

Hoogle дает traverse в качестве ближайшего совпадения, но это не совсем то, что я ищу. Есть ли способ построить функцию, которая мне нужна, используя мощные классные классы Haskell?

Без этого я могу управлять, но код должен быть более подробным, например Boardable <$> makeBListFrom a, где Boardable строительный стенд для t.

+3

Я не думаю, что для этой цели есть что-то конкретное. Мое единственное предложение состоит в том, что точечное написание того, что вы предлагаете в последнем абзаце, возможно, немного опрятно: 'fmap Boardable. makeBListFrom' – duplode

+0

Да! В точку. Это то, что я имею в виду. Спасибо. – Dahan

ответ

1

Почему не просто map конструктор над каждым элементом?

Prelude> data X a = C a deriving Show 
Prelude> map C [1, 2, 3] 
[C 1,C 2,C 3] 
Prelude> :t map C [1, 2, 3] 
map C [1, 2, 3] :: Num a => [X a] 
+1

OP уже делает это через '(<$>)' (см. Последний параграф вопроса). – duplode

+0

Я предположил, что они искали оператора, который ведет себя как «Boardable <$>', который соответствует «карте C». Возможно, я слишком много читал в этом вопросе. –

+0

Да. «map» или «fmap» или «<$>» явно возможно. Но это то, что я называю _verbose_. Прямо сейчас я с этим. То, что я ищу, для некоторого умного способа ** не **, чтобы дать фактический список «карте», но преобразовать функцию как есть. – Dahan

3

Если вы используете newtype, вы ищете coerce (так как с точки зрения времени выполнения, преобразование a -> [b] в a -> [t b] является не-ор). Конечно, это будет работать, только если Haskell сможет вывести тип, к которому вы пытаетесь принудить.

Вы получаете coerce makeBListFrom :: A -> [Boardable B] (где A и B - некоторые типы, определенные от makeBListFrom :: A -> [B]).


Это будет не работа для data. Кроме того, если бы это был я, я бы придерживался fmap Boardable . makeBListFrom - ваши намерения более ясны как компилятору, так и читателю (любой из них сможет синтезировать тип, вместо того, чтобы проверять его).

+0

Да. Спасибо за вход. Я с 'data' и более того, это' ExistentialQuantification' wrapper. Так да. 'fmap' является ключом. – Dahan