Выполнение утверждений в Haskell - PullRequest
0 голосов
/ 14 октября 2018

Скажем, у меня есть функция, которая вычисляет сумму между двумя числами:

computeSum :: Int -> Int -> Int
computeSum x y = x + y

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

Я простоНачал функциональное программирование с императива, где у нас может быть простая проверка в императивном программировании возвращаемого значения функции, такого как:

if value <= 10 and value > 0:
   return value

Просто интересно, есть ли что-то подобное в haskell?

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Обычно каждый использует Maybe для указания вычислений, которые могут "потерпеть неудачу", например:

computeSum :: Int -> Int -> <b>Maybe Int</b>
computeSum x y | result > 0 && result <= 10 = <b>Just</b> result
               | otherwise = <b>Nothing</b>
    where result = x + y

Так что он вернет Just result в случае совпадения утверждений или Nothingесли утверждения не выполнены.

Иногда Either String a используется для предоставления сообщения об ошибке, например:

computeSum :: Int -> Int -> <b>Either String Int</b>
computeSum x y | result > 0 && result <= 10 = <b>Right</b> result
               | otherwise = <b>Left</b> "Result is note between 0 and 10"
    where result = x + y

Вы также можете вызвать ошибку, но лично я думаю, что это не такжелательно, поскольку подпись не «намекает» на то, что вычисление может быть неудачным:

computeSum :: Int -> Int -> <b>Int</b>
computeSum x y | result > 0 && result <= 10 = result
               | otherwise = <b>error</b> "result is not between 0 and 10"
    where result = x + y
0 голосов
/ 14 октября 2018

Да, Haskell имеет операторы if:

function x y =
  let r = x + y
  in if r > 0 && r <= 10
     then r
     else error "I don't know what I'm doing."
0 голосов
/ 14 октября 2018

Да, Google говорит нам, что Control.Exception предоставляет assert :: Bool -> a -> a.

Но вы можете написать это сами:

assert :: Bool -> a -> a
assert False _ = error "Assertion failed!"
assert _     a = a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...