2014-01-20 4 views
-1

Мне нужна функциональность, которая проверяет, возвращает ли мой метод сообщение об ошибке, тогда я хочу, чтобы мой тестовый пример завершился иначе. Мой метод подписиМожно ли использовать любую строку для ввода? haskell

append::NestedList a->NestedList a->Either String (NestedList a) 

Поскольку мне нужно проверить возвращаемое значение этого метода я определяю новый метод

isError :: Either String (NestedList a)-> Bool 

isError x=if (null x) 
      then False 
      else True 

Здесь я хочу увидеть, если строка передается в IsError не равно нулю, что означает отказ. EИначе b означает, что я передаю либо a, либо b. Мне не нужно пропускать их обоих. Я не хочу ничего делать с NestedList, поэтому я не проверяю этот случай. Что в этом плохого?

Это не удается:

Couldn't match expected type `[a0]' 
      with actual type `Either String (NestedList a)' 
In the first argument of `null', namely `x' 
In the expression: (null x) 
In the expression: if (null x) then False else True 

ответ

2

Для того, чтобы работать с Either, вы должны понять, что это такое. Это просто контейнер для (в основном) проверки ошибок. Он может содержать только два варианта: либо a Left для ошибок, остальные Right - все в порядке!

В вашей append функции, она может возвращать только один из указанных выше двух возможностей:

-- returns either a Left String or a Right (NestedList a) 
append::NestedList a->NestedList a->Either String (NestedList a) 

Таким образом, вы можете просто проверить эти возможности в isError. Посмотрите на either определение в Data.Either. Или вы можете просто матч шаблон для Left, как показано на either:

isError :: Either String (NestedList a)-> Bool 
isError (Left x) = True 
isError _  = False 

Вот otherposts на одной и той же теме. RWH также переговоры об этом.

3

нуль определен в Список и производные структуры, в вашем случае вы можете переработать IsError в

isError (Left _) = True 
isError _ = False 

но я предпочел бы предложить, чтобы принять смотреть на Control.Monad.Error, потому что это позволит вам сделать гораздо больше, интересные вещи, включая синтаксический сахар для выражений «do» и преобразования монады.

+2

Вероятно, лучше предложить [ 'Control.Monad.Trans.Either'] (http://haddocks.fpcomplete.com/fp/7.4.2/ 20130829-168/либо/Control-Monad-Trans-Either.html), так как 'Control.Monad.Error' не ограничивает свой тип' Left' классом 'Error'. –

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

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