Array.indexedMap类型不匹配

2 elm

这是我在榆树上的第一天,但​​我不能处理这个打字问题.我尝试Array在我的应用程序中使用indexedMap,但是当我将自定义函数作为第一个参数应用于它时,编译器抱怨类型不匹配,这对我来说似乎不正确.我在这里错过了什么?

main =
  let
    values = Array.fromList [0, 1, 2, 3, 4, 5]
  in
    Array.indexedMap
      (addIndex values) /* <-- It tells me that it wants "Int -> b", but I would give it "Int -> Int" */
      values
    /* Should be [0, 2, 4, 6, 8, 10] */

addIndex values =
  \index ->
    let
      x = Maybe.withDefault 0 (Array.get index values)
    in
      x + index
Run Code Online (Sandbox Code Playgroud)

Igo*_*dov 6

为了使代码编译,您需要更改addIndex函数,因为Array.indexedMap需要一个类型的值Int -> a -> b,但addIndex返回一个类型的值Int -> b:

addIndex values =
  \index a ->
    let
      x = Maybe.withDefault 0 (Array.get index values)
    in
      x + index
Run Code Online (Sandbox Code Playgroud)

下面是一个说明的它

无论如何,您可能想知道,这另一个论点是什么?实际上,它是与索引相关联的数组的迭代值.这意味着,您不需要这一行:

x = Maybe.withDefault 0 (Array.get index values)
Run Code Online (Sandbox Code Playgroud)

因为你在迭代中已经有了这个值.因此,代码可以简化为:

main =
  let
    values = Array.fromList [0, 1, 2, 3, 4, 5]
  in
    text (Debug.toString (Array.indexedMap addIndex values))

addIndex : Int -> Int -> Int
addIndex index x = x + index
Run Code Online (Sandbox Code Playgroud)