# GIVETH

Specifies the return type of a function. Placed after GIVEN clauses and before the function definition.

## Syntax

```l4
GIVETH A Type
GIVETH Type
GIVES A Type
```

## Purpose

GIVETH declares what type a function returns. While L4 has type inference, explicit return types improve code clarity and catch errors early.

## Examples

**Example file:** 

```l4-file
-- GIVETH keyword examples

-- Basic Return Types

GIVEN n IS A NUMBER
GIVETH A NUMBER
square n MEANS n TIMES n

GIVEN a IS A NUMBER
      b IS A NUMBER
GIVETH A NUMBER
maximum a b MEANS IF a > b THEN a ELSE b

#EVAL square 7
#EVAL maximum 10 25

-- Boolean Return Types

GIVEN age IS A NUMBER
GIVETH A BOOLEAN
isAdult age MEANS age >= 18

GIVEN n IS A NUMBER
GIVETH A BOOLEAN
isEven n MEANS (n MODULO 2) EQUALS 0

#EVAL isAdult 21
#EVAL isEven 4

-- String Return Types

GIVEN name IS A STRING
GIVETH A STRING
greet name MEANS CONCAT "Hello, ", name

GIVEN num IS A NUMBER
GIVETH A STRING
describe num MEANS
  IF num > 0 THEN "positive"
  ELSE IF num < 0 THEN "negative"
       ELSE "zero"

#EVAL greet "Alice"
#EVAL describe (-5)

-- Complex Return Types

-- Returning MAYBE
GIVEN xs IS A LIST OF NUMBER
GIVETH A MAYBE NUMBER
safeHead xs MEANS
  CONSIDER xs
  WHEN EMPTY THEN NOTHING

  WHEN h FOLLOWED BY rest THEN JUST h

#EVAL safeHead (LIST 1, 2, 3)
#EVAL safeHead EMPTY

-- Returning LIST
GIVEN n IS A NUMBER
GIVETH A LIST OF NUMBER
countdown n MEANS
  IF n <= 0 THEN EMPTY
  ELSE n FOLLOWED BY countdown (n MINUS 1)

#EVAL countdown 5

-- GIVES as Synonym

GIVEN x IS A NUMBER
GIVES A NUMBER
triple x MEANS x TIMES 3

#EVAL triple 7

-- Parameterized Return Types

GIVEN a IS A TYPE, x IS AN a
GIVETH A LIST OF a
singleton x MEANS x FOLLOWED BY EMPTY

#EVAL singleton 42
#EVAL singleton "hello"

-- Record Return Types

DECLARE Person HAS name IS A STRING, age IS A NUMBER

GIVEN personName IS A STRING
      personAge IS A NUMBER
GIVETH A Person
makePerson personName personAge MEANS Person WITH name IS personName, age IS personAge

#EVAL makePerson "Bob" 30
```



### Basic Return Types

```l4
GIVEN n IS A NUMBER
GIVETH A NUMBER
square n MEANS n TIMES n

GIVEN s IS A STRING
GIVETH A NUMBER
stringLength s MEANS length s
```

### Boolean Return

```l4
GIVEN age IS A NUMBER
GIVETH A BOOLEAN
isAdult age MEANS age >= 18
```

### Complex Return Types

```l4
GIVEN xs IS A LIST OF NUMBER
GIVETH A MAYBE NUMBER
safeHead xs MEANS
  CONSIDER xs
  WHEN EMPTY THEN NOTHING
  WHEN h FOLLOWED BY _ THEN JUST h
```

### Parameterized Return Types

```l4
GIVEN a IS A TYPE
GIVEN x IS AN a
GIVEN y IS AN a
GIVETH A PAIR OF a, a
makePair x y MEANS Pair WITH first IS x, second IS y
```

## GIVES vs GIVETH

GIVES is a synonym for GIVETH:

```l4
GIVEN x IS A NUMBER
GIVES A NUMBER
triple x MEANS x TIMES 3
```

## Without GIVETH

L4 can infer return types, so GIVETH is optional:

```l4
-- Type inferred as NUMBER
GIVEN x IS A NUMBER
double x MEANS x TIMES 2
```

## Related Keywords

- **[GIVEN](/l4/reference/functions/GIVEN.md)** - Introduces parameters
- **[DECIDE](/l4/reference/functions/DECIDE.md)** - Function definition
- **[MEANS](/l4/reference/functions/MEANS.md)** - Function body

> Note: GIVES is a synonym for GIVETH.

## See Also

- **[Types Reference](/l4/reference/types.md)** - Available types
