在纯脚本中查找数组中的所有偶数但出现类型不匹配错误

Find all even number in array in purescript but getting type mismatch error

我正在解决一个问题,我必须用纯脚本计算数组中的所有偶数。我已经写下代码,但我面临类型不匹配错误。

import Data.Array (null)
import Data.Array.Partial (tail,head)
import Partial.Unsafe (unsafePartial)
import Math

iseven :: Int -> Boolean
iseven a = mod a 2 == 0


len :: forall a. Array a -> Int
len arr =
  if null arr
  then 0
  else
    if iseven unsafePartial head arr
      then 1 + len (unsafePartial tail arr)
      else len (unsafePartial tail arr)

但是我收到一个错误。

Error found:
in module $PSCI
at :6:18 - 6:40 (line 6, column 18 - line 6, column 40)

  Could not match type

    a1

  with type

    Int


while checking that type t0
  is at least as general as type Int
while checking that expression (unsafePartial head) arr
  has type Int
in binding group len

where a1 is a rigid type variable
        bound at (line 0, column 0 - line 0, column 0)
      t0 is an unknown type

我是纯脚本的新手,所以我无法理解错误。

当你写 unsafePartial head arr 时,这意味着“将函数 unsafePartial 应用于两个参数,第一个参数 head 和第二个参数 arr,但这不是你想要的想做。

您要做的是先计算 head arr,然后才将 unsafePartial 应用于计算结果。

为此,请使用括号:

unsafePartial (head arr)

$ 运算符:

unsafePartial $ head arr

修复该问题后,您遇到的下一个错误是关于 iseven 期望的参数以及您传递给它的内容。 len 的签名说 forall a. Array a ->,意思是“我将使用任何类型的数组”,但实际上它试图传递该数组的一个元素到 iseven,它需要一个 Int。所以你的函数承诺可以处理任何东西,但实际上想要 Int.

要修复,让签名说实话:函数需要一个 Ints 的数组:

len :: Array Int -> Int