[Haskell-cafe] Type level seq
Benjamin Franksen
ben.franksen at online.de
Fri Jun 22 10:46:06 UTC 2018
I have observed that type functions seem to be lazy. A type function
that is partial does not give me a type error when it is called with an
argument for which it is not defined.
Is there a 'seq' at the type level?
Here is my use case, simplified of course. Suppose we want to statically
track the state of a switch with a phantom type parameter:
> {-# LANGUAGE DataKinds, TypeFamilies #-}
>
> data State (s :: Bool) = State Bool deriving Show
>
> off :: State False
> off = State False
We want user code to be able to call the function 'turnOff' only if the
switch is currently on:
> turnOff :: State True -> State False
> turnOff (State True) = State False
This works fine:
*Main> turnOff off
<interactive>:1:9: error:
? Couldn't match type ?'False? with ?'True?
Expected type: State 'True
Actual type: State 'False
But now I want to abstract this pattern and write a (closed) type function
> type family TurnOff s where
> TurnOff True = False
> turnOff' :: State x -> State (TurnOff x)
> turnOff' (State True) = State False
> bad = turnOff' off
*Main> :t bad
bad :: State (TurnOff 'False)
*Main> bad
*** Exception: TypeLevelSeq.lhs:37:3-37: Non-exhaustive patterns in
function turnOff'
More information about the Haskell-Cafe
mailing list