# CommonEdge interview with Koki
### What's your experience with geometry? Especially differential geometry and things like parametric curves.
### Could you give a high-level overview of how you would translate a point cloud into a Bezier surface mesh?
### Fix the bugs in this function that converts a list of vectors into a list of points.
```haskell
data Vector = V2
{ dx :: Double
, dy :: Double
}
data Point = P2
{ x :: Double
, y :: Double
}
addPtVec :: Point -> Vector -> Point
addPtVec pt vec = P2 (X pt + Dx vec) (Y pt + Dy vec)
makeAbsolute = foldl addToLast (pure $ P2 0 0)
where
addToLast vec (pt :| pts) = addPtVec pt vec :| pt :: pts
```
### Given an list of values, return the greatest (without using sort or maximum).
```haskell
greatest :: Ord a => [a] -> a
greatest xs =
```
### Given a list of values, return the second greatest (without using sort).
```haskell
secondGreatest :: Ord a => [a] -> a
secondGreatest xs =
```
### Elaborate on the benifits and drawbacks on the following methods of error handling.
#### Error
```haskell=
head :: [a] -> a
head [] = error "head of empty list"
head (x:_) = x
```
#### Maybe
```haskell
data Maybe a = Nothing | Just a
head :: [a] -> Maybe a
head [] = Nothing
head (x:_) = Just x
```
#### Either
```haskell
data Either a b = Left a | Right b
data HeadOfEmpty = HeadOfEmpty deriving (Show)
head :: [a] -> Either HeadOfEmpty a
head [] = Left HeadOfEmpty
head (x:_) = Right x
```
#### MonadThrow
`MonadThrow` is a type class from the `exceptions` package that generalizes `throwIO` to non-IO monads.
```haskell=
class MonadThrow m where
throwM :: Exception e => e -> m a
instance Exception HeadOfEmpty
head :: MonadThrow m => [a] -> m a
head [] = throwM HeadOfEmpty
head (x:_) = pure x
```