#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
andlast
? Я бы использовал больше сопоставления с образцом: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. как я уже сказал вам там в комментариях, мое намерение в этом ответе было: «вы можете это сделать. давай вместе подумаем вслух».