пользовательский вызов функции высшего порядка дает аргумент не тип переменной в ошибке ограничения - PullRequest
0 голосов
/ 28 сентября 2018

Я новичок в Haskell, я пытался выяснить основы функции более высокого порядка.Таким образом, я создал этот пример

times3 x = x * 3
fn f x = f (x+3)
transform x = x+5
mapThenComputeV1 f f1 x = f (f1 (transform (x)))

после вызова

mapThenComputeV1 fn times3 4

Я получаю это исключение

*Main> mapThenComputeV1 fn times3 4

<interactive>:2:1: error:
    * Non type-variable argument in the constraint: Num (t1 -> t2)
      (Use FlexibleContexts to permit this)
    * When checking the inferred type
        it :: forall t1 t2. (Num t1, Num (t1 -> t2)) => t1 -> t2

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

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Аргумент f в mapThenComputeV1 - это функция, которую вы собираетесь применить.Вы передаете fn, который принимает два аргумента, но у вас есть лишние скобки в теле mapThenComputeV1.Попробуйте это:

mapThenComputeV1 f f1 x = f f1 (transform (x))
output> 36

Но я не уверен, что вы этого ожидаете.

0 голосов
/ 28 сентября 2018

Ваш mapThenComputeV1 имеет тип (a -> b) -> (Int -> a) -> Int -> b (или что-то подобное).

Вы пытаетесь применить его к fn times3 4.

fn :: (Int -> a) -> Int -> a

, поэтому haskell пытается применить mapThenComputeV1 до fn, но посмотрите, что типы не совпадают.Int нельзя сделать вывод, что (Int -> a).

PS : попробуйте добавить явные типы в ваши определения.Обычно это помогает мне найти проблему.

PPS : Если вы объясните, чего вы хотите достичь с помощью mapThenComputeV1, мы можем помочь вам исправить ваш пример.

...