Мне нужно иметь возможность применить функцию к n-му элементу списка. Например:Применить функцию к n-му элементу списка
> doSomething (+5) 2 [1,2,3,4,5]
должен вернуть [1,7,3,4,5]
У меня есть функция, которая может сделать это:
doSomething :: (a -> a) -> Int -> [a] -> [a]
doSomething f n xs = ys ++ [f x] ++ zs
where (ys, x:zs) = splitAt (n - 1) xs
, но я новичок в Haskell, и поэтому я уверен, что (как многие простые функции в Haskell), есть намного лучший способ сделать это.
Взгляните на линзы. – jamshidh
Взгляд на линзы может быть не лучшей идеей для кого-то нового для Haskell. Я думаю, что у вас здесь все хорошо. Вы ищете что-то более эффективное? Более идиоматично? Однострочный? –
@jamshidh Я быстро посмотрел на линзы, но я предпочел бы сделать это без каких-либо пакетов. – b3036667