Haskell — нет экземпляра для (Eq (Int -> Int)) из-за использования ‘==’

avatar
SorryIAmConfused
8 апреля 2018 в 11:37
327
1
0

в настоящее время я изучаю haskell. Я знаю, что мне нужно сделать типы данных экземпляром Eq, чтобы сравнить их. Но Int уже должен быть сопоставим, верно? Поэтому я не знаю, как справиться со следующей ошибкой:

• Нет экземпляра для (Eq (Int -> Int)) из-за использования ‘==’ (может быть, вы не применили функцию к достаточному количеству аргументов?)

Мой код выглядит следующим образом:

myRandomList = [1,2,3,4,5,6,7,8,9,10]


myFilterList :: [Int] -> [Int]
myFilterList [] = []
myFilterList (x:xs)
        | mod x == 0 = x : myFilterList xs
        | otherwise = myFilterList xs


myDotFunc = map (+ 1) . myFilterList . myRandomList  

Ps: я даже не уверен, будет ли мой код работать без этой ошибки, пожалуйста, помните, что я только что запустил Haskell :)

Источник
Willem Van Onsem
8 апреля 2018 в 11:39
2

Итак, mod x — это не число, вам нужно указать дополнительный аргумент.

max630
8 апреля 2018 в 15:30
0

Разве это не говорит больше о местоположении?

Regis Kuckaertz
8 апреля 2018 в 17:05
0

Более того, myRandomList не является функцией, вместо этого myDotFunc должно быть myDotFunc = map (+1) . myFilterList.

AJF
8 апреля 2018 в 18:13
0

Почему за это голосуют? Это не плохой вопрос.

Ответы (1)

avatar
AJF
8 апреля 2018 в 11:39
2

Вы указали только mod один аргумент в этой строке:

        | mod x == 0 = x : myFilterList xs
--        ^^^^^ HERE

Похоже, вы пытаетесь сравнить функции. Вы могли заметить, что GHC сообщает об этом в ошибке:

.

Нет экземпляра для (Eq (Int -> Int)) из-за использования ‘==’ (возможно, вы не применили функцию к достаточному количеству аргументов?)

Я должен быть mod x y, где y — модуль («делитель»). Я не знаю, что вы хотите, чтобы y было, поэтому я не могу исправить ваш код.

SorryIAmConfused
8 апреля 2018 в 11:55
0

о черт :( вы правы! я тоже новичок в coderhelper, я должен просто удалить свой вопрос? Большое спасибо!

chi
8 апреля 2018 в 12:04
1

@NikBerlin Нет, не удаляйте его после того, как на него ответили. Это помешает ответчику получить какую-либо репутацию. Действительно, SO даже не позволяет вам удалить его, когда есть ответ, за который проголосовали, я полагаю. (Если ответ не опубликован, можно удалить его, если вы понимаете, что вопрос не представляет ценности для вас и/или для других.)