У меня возникли трудности с пониманием того, как использовать сопоставление образцов в стражах.Haskell - Pattern Соответствие форме (x: y: zs)
У меня есть эта функция выбора, целью которой является возвращение последнего символа в строку.
myFun :: [Char] -> Char
myFun [email protected](f:s:rst)
| str == "" = error "0 length string"
| length str == 1 = head str
| rst == "" = s
| otherwise = lame (s:rst)
Он не работает с «Неисчерпыванием шаблонов в функции» при передаче строки с одним символом.
Я предполагаю, что Haskell понимает, что он не может использовать форму (f:s:rst)
для соответствия списку отдельных элементов, а затем сбой до попытки оценить вызов length
.
Как сделать охрану, которая сообщит Haskell, что делать, когда есть только один элемент?
Это работает - Реалистично существует множество более простых/лучших способов сделать это. То, что я действительно борется с этим, пытается выяснить, есть ли способ рассказать охранникам, что делать, если аргумент не может быть деконструирован через предоставленный шаблон. Должен ли я принять ваш ответ, чтобы это означало: «Да, если вы определяете шаблон в объявлении функции, это невозможно при использовании защитных устройств» –
Сначала происходит сопоставление шаблонов на уровне функций, что означает, что первые два охранника условия, которые у вас никогда не могут быть выполнены (те, где вы проверяете «str» от нуля или одной длины) –