packages feed

liquidhaskell-0.8.0.2: tests/todo/ApplicativeMaybe1.hs

{-@ LIQUID "--higherorder"     @-}
{- LIQUID "--totality"        @-}
{-@ LIQUID "--exact-data-cons" @-}
{-@ LIQUID "--automatic-instances=liquidinstances" @-}
{-@ LIQUID "--fuel=10" @-}

{-# LANGUAGE IncoherentInstances   #-}
{-# LANGUAGE FlexibleContexts #-}
module ListFunctors where

import MaybeReflect1
import Prelude hiding (Maybe(..))
import Language.Haskell.Liquid.ProofCombinators


-- This is OK

{-@ compositionOK :: x:Maybe (a -> a)
                -> y:Maybe (a -> a)
                -> z:Maybe a
                -> { seqm x (seqm y z)  = seqm x (seqm y z) } @-}

compositionOK :: Maybe (a -> a) -> Maybe (a -> a) -> Maybe a -> Proof
compositionOK = undefined 



-- But the following says "unbound symbol seqm"
-- Which is weird as seqm is OK in the above signature

{-


 /Users/niki/liquidtypes/liquidhaskell/tests/todo/ApplicativeMaybe1.hs:28:20: Error: Bad Type Specification
 ListFunctors.composition :: x:(Maybe (a -> a)) -> y:(Maybe (a -> a)) -> z:(Maybe a) -> {VV : () | seqm (seqm (seqm (purem composem) x) y) z == seqm x (seqm y z)}
     Sort Error in Refinement: {VV : Tuple | seqm (seqm (seqm (purem composem) x) y) z == seqm x (seqm y z)}
     Unbound Symbol seqm
 Perhaps you meant: head, len, snd

-}

{-@ composition :: x:Maybe (a -> a)
                -> y:Maybe (a -> a)
                -> z:Maybe a
                -> { (seqm (seqm (seqm (purem composem) x) y) z)  = seqm x (seqm y z) } @-}

composition :: Maybe (a -> a) -> Maybe (a -> a) -> Maybe a -> Proof
composition = undefined