Смущен «может быть» Хаскелла, может ли кто-нибудь мне помочь?

#haskell #functional-programming

Вопрос:

Мое собственное местоположение типа данных определено ниже:

 data Location = Location String Int  

И моя необходимая функция выглядит так:

 Function:: String-> Maybe Location Funtion s  |head(s)`elem`['A','B','C','D','E','F','G','H'] amp;amp; last(s) `elem`['1','2','3','4'] = Just Location head(s) digitToInt(last(s))  |otherwise = Nothing  

Однако, когда я пытаюсь запустить в терминале, это показывает следующее:

 Couldn't match expected type ‘([a0] -> a0)  -> String -> (Char -> Int) -> Char -> Maybe Location’  with actual type ‘Maybe (String -> Int -> Location)’ The function ‘Just’ is applied to five arguments, but its type ‘(String -> Int -> Location)  -> Maybe (String -> Int -> Location)’ has only one  

Комментарии:

1. вам нужны правильные родители. Just требуется один аргумент.

2. Just Location head(s) digitToInt(last(s)) вызовы Just , передающие 5 аргументов: Location, head, s, digitToIns, (last s) . Добавьте круглые скобки и обратите внимание, что вызов функции лучше всего писать как (f x) «нет f(x) «.

3. Вы намерены создать строку , подобную "AZ3" Just (Location "A" 3) product, или это будет просто побочным эффектом использования head and last ? Я бы использовал больше сопоставления с образцом: f [s, n] = ...; f_ = Nothing .

Ответ №1:

Синтаксис

 f x y  

означает применение функции f к аргументам x и y . Обратите внимание, что для вызова не требуется никаких круглых скобок f . Однако, если x и y сами по себе были сложными выражениями, им могут потребоваться круглые скобки, чтобы сгруппировать части этого выражения в один аргумент. Предположим, я хочу обратиться f к аргументам g v и h w . Контраст:

 f g v h w -- f applied to g, v, h, and w; not what I wanted f (g v) (h w) -- f applied to (g v) and (h w); what I wanted  

Поскольку скобки только группируют выражения и сами по себе не являются частью синтаксиса вызова функций, это означает, что у нас также есть:

 f g (v) h (w) -- f applied to g, (v), h, and (w) f g(v) h(w) -- still f applied to g, (v), h, and (w)  

Итак, когда вы напишете

 Just Location head(s) digitToInt(last(s))  

это означает, что нужно применить Just к пяти аргументам, а именно , Location , head , (s) digitToInt , и (last(s)) . Вероятно, это не то, что вы имели в виду!

Надеюсь, это даст вам достаточно информации, чтобы сделать вторую попытку заключить в скобки то, что вы намеревались.

Комментарии:

1. Я должен сказать: «Я понимаю, что пытаюсь объяснить вещи новичкам, но код в этом ответе вводит в заблуждение. Just не принимает так много аргументов. На самом деле, для этого требуется только один аргумент. Ваш код просто неправильный». и если вы протестуете, что уже говорите об этом в ответе и показываете этот код только для того, чтобы ОП мог изучить его при исправлении, то это точно относится к моему последнему ответу хаскелла и вашим комментариям там. так что я просто принял урок, который ты преподал мне там, близко к сердцу, и применил его здесь. 🙂

2. @WillNess Я не писал код в этом ответе… по крайней мере, не тот код, на который вы ссылаетесь.

3. Вы игнорируете то, что я пытаюсь вам сказать, точно так же, как вы проигнорировали мои уточняющие комментарии к этому ответу. Я действительно сбит с толку всем этим.

4. @WillNess Я не игнорирую тебя. Я думаю, что существует законная разница между «Вещь X, которую вы сказали, неверна таким-то и таким-то образом» и «Решение вашей проблемы-это X» (где X содержит плохой код).

5. как я уже сказал вам там в комментариях, мое намерение в этом ответе было: «вы можете это сделать. давай вместе подумаем вслух».