Когда вы пишете 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