Найти все четные числа в массиве в purescript, но получить ошибку несоответствия типов - PullRequest
0 голосов
/ 01 октября 2019

Я решаю проблему, в которой мне нужно подсчитать все четные числа в массиве в purescript. Я записал код, но столкнулся с ошибкой несоответствия типов.

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

Я новичок в purescript, поэтому не могу понять ошибку.

1 Ответ

1 голос
/ 01 октября 2019

Когда вы пишете unsafePartial head arr, это означает «применить функцию unsafePartial к двум аргументам, первому аргументу head и второму аргументу arr, но это не то, что вы хотите сделать.

Что вы хотите сделать, это сначала вычислить head arr, и только затем применить unsafePartial к результату этого.

Для этого используйте круглые скобки:

unsafePartial (head arr)

или $ оператор:

unsafePartial $ head arr

После того, как вы исправите это, следующая ошибка, которую вы получите, о том, что iseven ожидает в качестве аргумента и что вы передаете ему. len говорит forall a. Array a ->, что означает " Я буду работать с массивами любого типа ", но в действительности он пытается передать элемент этого массива в iseven, который ожидает IntИтак, ваша функция обещала работать с чем угодно, но на самом деле хочет Int.

Чтобы исправить, заставьте подпись сказать правду: функция хочет массив Int s:

len :: Array Int -> Int
...