Comments (2)
Hi @NorfairKing,
Thanks for this example (& sorry for the delay!)
Unfortunately, dropWhile
is rather more complicated,
and you can't do it "directly" in this style due to various
current implementation limitations.
- The
es
thing is (I believe) solved indevelop
...
earlier you couldn't have refinements in measures... - The real hassle is that
not (Prop (p (head o)))
is
currently not supported, primarily as you cannot
directly use the higher order predicatep
inside
the specifications. (In general, you can only use
measures + arithmetic in specifications).
So, instead you need to define "lists whose head satisfies some property p"
which we can do like so:
{-@ data List a <p :: a -> Prop> = Emp
| (:::) { hd :: a<p>
, tl :: List a }
@-}
After which, dropWhile
looks like
{-@ dropWhile :: forall <p :: a -> Prop, w :: a -> Bool -> Prop>.
(Witness a p w) =>
(x:a -> Bool<w x>) -> List a -> List <p> a
@-}
dropWhile :: (a -> Bool) -> List a -> List a
dropWhile f (x:::xs)
| not (f x) = x ::: xs
| otherwise = dropWhile f xs
dropWhile f Emp = Emp
{-@ bound witness @-}
witness :: Eq a => (a -> Bool) -> (a -> Bool -> Bool) -> a -> Bool -> a -> Bool
witness p w = \ y b v -> (not b) ==> w y b ==> (v == y) ==> p v
The strange Witness
thing says that
- IF predicate
f x
returns aBool
that isFalse
- THEN then
x
satisfies the predicatep
We then have that the output of dropWhile
has a head that satisfies p
,
after which the rest follows.
In short: this is rather clunky It would be much nicer to support a spec
like yours; and perhaps we can figure out how to get there...
from liquidhaskell-tutorial.
Thank you for the response!
from liquidhaskell-tutorial.
Related Issues (20)
- Regarding reverse in Ch 8: Sets HOT 2
- How to workaround using Stack for building html HOT 7
- apparent typo in tutorial under "Testing Values: Booleans and Propositions"
- Can't even get started because of build issues HOT 5
- there is an extra ")" at the end of this line
- Numbering the exercises HOT 1
- Question about Chapter 5.3: delmin HOT 2
- Links to subsections don't work for me HOT 2
- Syntax of refinement types HOT 4
- Chapter 8 exercise "reverse" HOT 8
- Instructions for running LiquidHaskell HOT 2
- Figures 1.4 and 1.5 in Chapter 12
- Chapter 12 Exercise InsertRight HOT 4
- Current HEAD of main fails to build HOT 4
- Liquid Type Mismatch on Initial Build HOT 2
- Passing -fdefer-type-errors to GHC causes confusing errors from LH HOT 3
- Text description of "null" in Chapter 6 is reversed HOT 1
- Link is no longer available HOT 1
- Trouble with Chapter 11 HOT 3
- About Lemmas and other questions HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from liquidhaskell-tutorial.