2014-11-04 2 views
2

Я хочу создать функцию, которая отображает последний элемент списка. Это мой код:Неисследовательный шаблон в функции в GHCi

ghci> let myLast :: [a] -> a 
ghci> let myLast [] = error 
ghci> let myLast [x] = x 
ghci> let myLast (x:xs) = myLast xs 

И я получаю следующее сообщение об ошибке:

***Exception: Non-exhaustive patterns in function myLast 

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

ответ

5

Если вы используете let в каждой строке, каждое определение будет иметь функцию новый имени myLast, затенения все предыдущие определения. Так что вы закончили с эквивалентом

GHCi> let myLast (x:xs) = myLast xs

только.

То, что вы, вероятно, хотите, чтобы сделать файл Haskell, скажем MyLast.hs, содержащий

module MyLast where 

myLast :: [a] -> a 
myLast [] = error 
myLast [x] = x 
myLast (x:xs) = myLast xs 

вы можете загрузить этот файл в GHCi с ghci MyLast.hs.

Ключевое слово let только необходима, когда вы уже в GHCi (или, в некоторых монады как IO, или в другой функции) и хотите сделать локальное определение. Но тогда вы должны использовать только let, например.

GHCi> let myLast :: [a]->a; myLast [] = error; myLast [x] = x; myLast (x:xs) = myLast xs

или

twiceLast :: [Int] -> [Int] 
twiceLast = let myLast [] = error 
       myLast [x] = x 
       myLast (x:xs) = myLast xs 
      in \xs -> 2 * last xs 

, который я бы, однако, предпочитаю писать в

twiceLast = (2*) . myLast 
where myLast [] = error 
     myLast [x] = x 
     myLast (x:xs) = myLast xs 
2

В GHCI каждое использование let вводит новое определение, так что вы пересматриваете свои несколько функций вместо добавления случаев.

две альтернативы:

  • место определение в файл и загрузить его с :r командой
  • использования :{ ... :} ввести несколько строк:

т.д .:

*Main> :{ 
*Main| let foo [] = True 
*Main|  foo _ = False 
*Main| :} 
*Main> 

 Смежные вопросы

  • Нет связанных вопросов^_^