Search code examples
haskellschememit-scheme

Representing undefined result in MIT Scheme


Imagine I have a function with a domain of all integers bigger than 0. I want the result of other inputs to be undefined. For the sake of simplicity, let's say this is the increment function. In Haskell, I could achieve this with something like

f :: Integer -> Integer
f x 
  | x > 0 = x + 1
  | otherwise = undefined

Of course, the example is quite gimped but it should be clear what I want to achieve. I'm not sure how to achieve the similar in Scheme.

(define (f x)
  (if (> x 0)
      (+ x 1)
      (?????)))

My idea is to just stick an error in there but is there any way to replicate the Haskell behaviour more closely?


Solution

  • Your question is related to this one which has answers pointing out that in R5RS (which I guess MIT scheme partially supports?), the if with one branch returns an "unspecified value". So the equivalent to the haskell code should be:

    (define (f x)
      (if (> x 0)
          (+ x 1)))
    

    You probably already know this: in haskell undefined is defined in terms of error, and is primarily used in development as a placeholder to be removed later. The proper way to define your haskell function would be to give it a type like: Integer -> Maybe Integer.