Обходной путь может быть помечен. Чтобы продвинуть эту идею на один шаг дальше, можно применить функцию к любому элементу пересекаемого по его индексу.
import Control.Monad.State
updateAt :: forall a. Int -> (a -> a) -> [a] -> [a]
updateAt i f = flip evalState [0..] . traverse g
where
g :: a -> State [Int] a
g x = do
js <- get
case js of
[ ] -> error ""
(j: js') -> do
put js'
if j == i
then return (f x)
else return x
В Haskell,есть попытка обобщить или иначе отсортировать операции, подобные этой. Сначала это было клавиш , затем оно переросло в объектив . Сейчас это огромный пакет. Я пытаюсь понять это.
С этой целью я сначала пытаюсь сделать простые вещи. Одна простая вещь - то, с чего я начал - маркировать проходимый. Это можно сделать? Кроме того, может ли это быть сделано на «низком уровне» ?
element
, кажется, делает то же самое, что и мой пример выше, поэтому я проверил его определение,Это привело меня к Indexable
, а затем к это :
class ( Choice p, Corepresentable p, Comonad (Corep p)
, Traversable (Corep p), Strong p, Representable p, Monad (Rep p)
, MonadFix (Rep p), Distributive (Rep p), Costrong p, ArrowLoop p
, ArrowApply p, ArrowChoice p, Closed p
) => Conjoined p
Я признаю, что это немного над моей головой. Мне нравится, как "indexable" звучит - это должно быть полезно. Но это также кажется самым трудным произведением на Хаскеле. Я понимаю, что Conjoined
- продвинутый вид профессора, так что в основном ... функция? Я не уверен, что это может быть, и как все это связано с контейнерами с ключами.
Применимо ли это к моей проблеме? Для чего это? Как я могу понять это?