Что я сделал (с некоторой помощью от друга), создайте функцию, которая принимает индекс, который принимает индекс, а для функции - значение , Int
и функцию указанный индекс. Он похож на Map
, но вместо применения функции к каждому элементу он применяет его только к одному элементу.Как изменить элемент списка по заданному индексу
Так что мои вопросы:
- ли эта функция уже существует в ядре где-нибудь? Мы не смогли его найти.
- Если нет, есть ли лучший способ сделать это, чем то, как мы это сделали?
Вот код:
import Html exposing (text)
main =
let
m = {arr=[1,5,3], msg=""}
in
text (toString (getDisplay m 4 (\x -> x + 5)))
type alias Model =
{ arr : List (Int)
, msg : String
}
getDisplay : Model -> Int -> (Int -> Int) -> Model
getDisplay model i f =
let
m = (changeAt model.arr i f)
in
case m of
Ok val ->
{model | arr = val, msg = ""}
Err err ->
{model | arr = [], msg = err}
changeAt : List a -> Int -> (a -> a) -> Result String (List a)
changeAt l i func =
let
f j x = if j==i then func x else x
in
if i < (List.length l) && i >= 0 then
Ok(List.indexedMap f l)
else
Err "Bad index"
ПРИМЕЧАНИЕ: Elm discourages indexing Lists, as they are linked lists under the hood: to retrieve the 1001th element, you have to first visit all 1000 previous elements. Тем не менее, если вы хотите, чтобы это сделать, это один из способов.