Merge branch 'master' into wip/tactical

This commit is contained in:
David Raymond Christiansen 2015-03-02 14:02:33 +01:00
commit 20e602829a
59 changed files with 391 additions and 240 deletions

View File

@ -1,4 +1,10 @@
language: haskell language: haskell
ghc:
# Idris won't build on 7.4 and earlier due to dependency
# problems. 7.10 isn't yet supported on Travis.
- 7.6
- 7.8
before_install: before_install:
- sudo add-apt-repository --yes ppa:h-rayflood/llvm - sudo add-apt-repository --yes ppa:h-rayflood/llvm
- sudo apt-get update -qq - sudo apt-get update -qq

View File

@ -8,7 +8,18 @@ New in 0.9.17:
* Quasiquotation supports the generation of Language.Reflection.Raw terms * Quasiquotation supports the generation of Language.Reflection.Raw terms
in addition to Language.Reflection.TT. Types are used for disambiguation, in addition to Language.Reflection.TT. Types are used for disambiguation,
defaulting to TT at the REPL. defaulting to TT at the REPL.
* Library operators have been renamed for consistency with Haskell. In
particular, Applicative.(<$>) is now Applicative.(<*>) and (<$>) is
now an alias for Functor.map. Correspondingly, ($>) and (<$) have
been renamed to (<*) and (*>). The cascading effects of this rename
are that Algebra.(<*>) has been renamed to Algebra.(<.>) and
Matrix.(<.>) is now Matrix.(<:>).
* Binding forms in DSL notation are now given an extra argument: a
reflected representation of the name that the user chose.
Specifically, the rewritten lambda, pi, and let binders will now get
an extra argument of type TTName. This allows more understandable
dynamic errors in DSL code and more readable code generation results.
New in 0.9.16: New in 0.9.16:
-------------- --------------
* Inductive-inductive definitions are now supported (i.e. simultaneously * Inductive-inductive definitions are now supported (i.e. simultaneously

29
CITATION.md Normal file
View File

@ -0,0 +1,29 @@
# Citing `Idris`
If you use `Idris` in your work we would prefer it if you would use the following reference in your work.
## BibTeX
```bibtex
@article{JFP:9060502,
author = {BRADY,EDWIN},
title = {Idris, a general-purpose dependently typed programming language: Design and implementation},
journal = {Journal of Functional Programming},
volume = {23},
issue = {05},
month = {9},
year = {2013},
issn = {1469-7653},
pages = {552--593},
numpages = {42},
doi = {10.1017/S095679681300018X},
URL = {http://journals.cambridge.org/article_S095679681300018X},
}
```
## Textual
EDWIN BRADY (2013). Idris, a general-purpose dependently typed
programming language: Design and implementation. Journal of
Functional Programming, 23, pp
552-593. doi:10.1017/S095679681300018X.

View File

@ -7,10 +7,9 @@ sqltest : testunit.idr Sqlite3.idr sqlite3api.o
idris testunit.idr -o sqltest idris testunit.idr -o sqltest
sqlite3api.o : sqlite3api.c sqlite3api.o : sqlite3api.c
gcc -c sqlite3api.c gcc -I . -c sqlite3api.c
sqlite3api.so: sqlite3api.c sqlite3api.so: sqlite3api.c
gcc -fPIC -o sqlite3api.so -shared sqlite3api.c gcc -I . -fPIC -o sqlite3api.so -shared sqlite3api.c
all : sqltest sqlite3api.o all : sqltest sqlite3api.o

View File

@ -1,8 +1,9 @@
module Sqlite3 module Sqlite3
import Sqlexpr import public Sqlexpr
%lib C "sqlite3" %lib C "sqlite3"
-- %link C "sqlite3.o"
-- %include C "sqlite3.h"
%link C "sqlite3api.o" %link C "sqlite3api.o"
%include C "sqlite3api.h" %include C "sqlite3api.h"
@ -47,7 +48,7 @@ instance Functor DB where
instance Applicative DB where instance Applicative DB where
pure = MkDB . return . Right pure = MkDB . return . Right
(MkDB f) <$> (MkDB x) = MkDB (do f' <- f (MkDB f) <*> (MkDB x) = MkDB (do f' <- f
case f' of case f' of
Left err => return (Left err) Left err => return (Left err)
Right op => x >>= (return . map op)) Right op => x >>= (return . map op))
@ -59,7 +60,7 @@ instance Monad DB where
Left err => return (Left err) Left err => return (Left err)
Right v => case k v of Right v => case k v of
MkDB k' => k') MkDB k' => k')
return x = MkDB (return (Right x)) --return x = MkDB (return (Right x))
fail : String -> DB a fail : String -> DB a
fail err = MkDB (return (Left err)) fail err = MkDB (return (Left err))
@ -83,7 +84,7 @@ runDB (MkDB f) = do f' <- f
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
open_db : String -> DB DBPointer open_db : String -> DB DBPointer
open_db name = do x <- liftIO (mkForeign (FFun "sqlite3_open_idr" [FString] FPtr) name) open_db name = do x <- liftIO (foreign FFI_C "sqlite3_open_idr" (String -> IO Ptr) name)
return (MkDBPointer x) return (MkDBPointer x)
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@ -91,7 +92,7 @@ open_db name = do x <- liftIO (mkForeign (FFun "sqlite3_open_idr" [FString] FPtr
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
close_db : DBPointer -> DB Int close_db : DBPointer -> DB Int
close_db (MkDBPointer pointer) = liftIO (mkForeign (FFun "sqlite3_close_idr" [FPtr] FInt) pointer) close_db (MkDBPointer pointer) = liftIO (foreign FFI_C "sqlite3_close_idr" (Ptr -> IO Int) pointer)
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- | Wrapper around prepare, step and finalize. -- | Wrapper around prepare, step and finalize.
@ -99,7 +100,7 @@ close_db (MkDBPointer pointer) = liftIO (mkForeign (FFun "sqlite3_close_idr" [FP
exec_db : DBPointer -> String -> DB Int exec_db : DBPointer -> String -> DB Int
exec_db (MkDBPointer pointer) stmt = do exec_db (MkDBPointer pointer) stmt = do
x <- liftIO (mkForeign (FFun "sqlite3_exec_idr" [FPtr, FString] FInt) pointer stmt) x <- liftIO (foreign FFI_C "sqlite3_exec_idr" (Ptr -> String -> IO Int) pointer stmt)
if (x == 1) if (x == 1)
then fail "Could not execute." then fail "Could not execute."
else return x else return x
@ -110,7 +111,7 @@ exec_db (MkDBPointer pointer) stmt = do
exec_db_v2 : StmtPtr -> DB Int exec_db_v2 : StmtPtr -> DB Int
exec_db_v2 (MkStmtPtr pointer) = do exec_db_v2 (MkStmtPtr pointer) = do
x <- liftIO (mkForeign (FFun "exec_db" [FPtr] FInt) pointer) x <- liftIO (foreign FFI_C "exec_db" (Ptr -> IO Int) pointer)
if (x == 21) if (x == 21)
then fail "No data returned." then fail "No data returned."
else return x else return x
@ -122,8 +123,7 @@ exec_db_v2 (MkStmtPtr pointer) = do
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
get_error : DBPointer -> IO String get_error : DBPointer -> IO String
get_error (MkDBPointer pointer) = mkForeign (FFun "sqlite3_get_error" [FPtr] FString) pointer get_error (MkDBPointer pointer) = foreign FFI_C "sqlite3_get_error" (Ptr -> IO String) pointer
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- | Compiles the query inot a byte-code program in order to execute it. -- | Compiles the query inot a byte-code program in order to execute it.
@ -133,7 +133,7 @@ get_error (MkDBPointer pointer) = mkForeign (FFun "sqlite3_get_error" [FPtr] FSt
prepare_db : DBPointer -> String -> DB StmtPtr prepare_db : DBPointer -> String -> DB StmtPtr
prepare_db (MkDBPointer pointer) cmd = do prepare_db (MkDBPointer pointer) cmd = do
result <- liftIO (mkForeign (FFun "sqlite3_prepare_idr" [FPtr, FString] FPtr) pointer cmd) result <- liftIO (foreign FFI_C "sqlite3_prepare_idr" (Ptr -> String -> IO Ptr) pointer cmd)
flag <- liftIO (nullPtr result) flag <- liftIO (nullPtr result)
if flag if flag
then fail "Error occured while preparing" then fail "Error occured while preparing"
@ -147,8 +147,8 @@ prepare_db (MkDBPointer pointer) cmd = do
step_db : StmtPtr -> DB Int step_db : StmtPtr -> DB Int
step_db (MkStmtPtr pointer)= do step_db (MkStmtPtr pointer)= do
x <- liftIO (mkForeign (FFun "sqlite3_step_idr" [FPtr] FInt)pointer) x <- liftIO (foreign FFI_C "sqlite3_step_idr" (Ptr -> IO Int) pointer)
if ( x == 101) if (x == 101)
then fail "SQLITE_DONE" then fail "SQLITE_DONE"
else return x else return x
@ -159,7 +159,7 @@ step_db (MkStmtPtr pointer)= do
finalize_db : StmtPtr -> DB Int finalize_db : StmtPtr -> DB Int
finalize_db (MkStmtPtr pointer) = do finalize_db (MkStmtPtr pointer) = do
x <- liftIO (mkForeign (FFun "sqlite3_finalize_idr" [FPtr] FInt) pointer) x <- liftIO (foreign FFI_C "sqlite3_finalize_idr" (Ptr -> IO Int) pointer)
if (x /= 0) if (x /= 0)
then fail "Could not finalize" then fail "Could not finalize"
else return x else return x
@ -170,7 +170,7 @@ finalize_db (MkStmtPtr pointer) = do
reset_db : StmtPtr -> DB Int reset_db : StmtPtr -> DB Int
reset_db (MkStmtPtr pointer) = do reset_db (MkStmtPtr pointer) = do
x <- liftIO (mkForeign (FFun "sqlite3_reset_idr" [FPtr] FInt) pointer) x <- liftIO (foreign FFI_C "sqlite3_reset_idr" (Ptr -> IO Int) pointer)
if (x /= 0) if (x /= 0)
then fail "Could not reset" then fail "Could not reset"
else return x else return x
@ -181,38 +181,34 @@ reset_db (MkStmtPtr pointer) = do
column_count : DBPointer -> IO (Either String Int) column_count : DBPointer -> IO (Either String Int)
column_count (MkDBPointer pointer) = do column_count (MkDBPointer pointer) = do
x <- mkForeign (FFun "sqlite3_column_count_idr" [FPtr] FInt) pointer x <- foreign FFI_C "sqlite3_column_count_idr" (Ptr -> IO Int) pointer
return $ if (x == 0 ) return $ if (x == 0)
then Left "No Data" then Left "No Data"
else (Right x) else (Right x)
column_name : DBPointer -> Int -> IO String column_name : DBPointer -> Int -> IO String
column_name (MkDBPointer pointer) iCol = column_name (MkDBPointer pointer) iCol =
mkForeign (FFun "sqlite3_column_name_idr" [FPtr, FInt] FString) pointer iCol foreign FFI_C "sqlite3_column_name_idr" (Ptr -> Int -> IO String) pointer iCol
column_decltype : DBPointer -> Int -> IO String column_decltype : DBPointer -> Int -> IO String
column_decltype (MkDBPointer pointer) iCol = column_decltype (MkDBPointer pointer) iCol =
mkForeign (FFun "sqlite3_column_decltype_idr" [FPtr, FInt] FString) pointer iCol foreign FFI_C "sqlite3_column_decltype_idr" (Ptr -> Int -> IO String) pointer iCol
column_bytes : DBPointer -> Int -> IO Int column_bytes : DBPointer -> Int -> IO Int
column_bytes (MkDBPointer pointer) iCol = column_bytes (MkDBPointer pointer) iCol =
mkForeign (FFun "sqlite3_column_bytes_idr" [FPtr, FInt] FInt) pointer iCol foreign FFI_C "sqlite3_column_bytes_idr" (Ptr -> Int -> IO Int) pointer iCol
column_blob : DBPointer -> Int -> IO String column_blob : DBPointer -> Int -> IO String
column_blob (MkDBPointer pointer) iCol = column_blob (MkDBPointer pointer) iCol =
mkForeign (FFun "sqlite3_column_bytes_idr" [FPtr, FInt] FString) pointer iCol foreign FFI_C "sqlite3_column_bytes_idr" (Ptr -> Int -> IO String) pointer iCol
column_text : DBPointer -> Int -> IO String column_text : DBPointer -> Int -> IO String
column_text (MkDBPointer pointer) iCol = column_text (MkDBPointer pointer) iCol =
mkForeign (FFun "sqlite3_column_text_idr" [FPtr, FInt] FString) pointer iCol foreign FFI_C "sqlite3_column_text_idr" (Ptr -> Int -> IO String) pointer iCol
column_Int : DBPointer -> Int -> IO Int column_Int : DBPointer -> Int -> IO Int
column_Int (MkDBPointer pointer) iCol = column_Int (MkDBPointer pointer) iCol =
mkForeign (FFun "sqlite3_column_int_idr" [FPtr, FInt] FInt) pointer iCol foreign FFI_C "sqlite3_column_int_idr" (Ptr -> Int -> IO Int) pointer iCol
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- | These routines support some of SQLite backup functions. -- | These routines support some of SQLite backup functions.
@ -220,22 +216,21 @@ column_Int (MkDBPointer pointer) iCol =
backup_init : DBPointer -> String -> DBPointer -> String -> IO DBPointer backup_init : DBPointer -> String -> DBPointer -> String -> IO DBPointer
backup_init (MkDBPointer des_pointer) destName (MkDBPointer src_pointer) srcName = backup_init (MkDBPointer des_pointer) destName (MkDBPointer src_pointer) srcName =
do x <- mkForeign (FFun "sqlite3_backup_init_idr" [FPtr,FString, FPtr, FString] FPtr) do x <- foreign FFI_C "sqlite3_backup_init_idr" (Ptr -> String -> Ptr -> String -> IO Ptr)
des_pointer destName src_pointer srcName des_pointer destName src_pointer srcName
return (MkDBPointer x) return (MkDBPointer x)
backup_step : DBPointer -> Int -> IO Int backup_step : DBPointer -> Int -> IO Int
backup_step (MkDBPointer pointer) nPage = backup_step (MkDBPointer pointer) nPage =
mkForeign (FFun "sqlite3_backup_step_idr" [FPtr, FInt] FInt) pointer nPage foreign FFI_C "sqlite3_backup_step_idr" (Ptr -> Int -> IO Int) pointer nPage
backup_finish : DBPointer -> IO Int backup_finish : DBPointer -> IO Int
backup_finish (MkDBPointer pointer) = backup_finish (MkDBPointer pointer) =
mkForeign (FFun "sqlite3_backup_finish_idr" [FPtr] FInt) pointer foreign FFI_C "sqlite3_backup_finish_idr" (Ptr -> IO Int) pointer
backup_remaining : DBPointer -> IO Int backup_remaining : DBPointer -> IO Int
backup_remaining (MkDBPointer pointer) = backup_remaining (MkDBPointer pointer) =
mkForeign (FFun "sqlite3_backup_remaining_idr" [FPtr] FInt) pointer foreign FFI_C "sqlite3_backup_remaining_idr" (Ptr -> IO Int) pointer
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- | Use of this interface is not recommended. -- | Use of this interface is not recommended.
@ -246,19 +241,18 @@ backup_remaining (MkDBPointer pointer) =
get_table : DBPointer -> String -> DB TBPointer get_table : DBPointer -> String -> DB TBPointer
get_table (MkDBPointer pointer) name = do get_table (MkDBPointer pointer) name = do
x <- liftIO(mkForeign (FFun "sqlite3_get_table_idr" [FPtr, FString] FPtr) pointer name) x <- liftIO(foreign FFI_C "sqlite3_get_table_idr" (Ptr -> String -> IO Ptr) pointer name)
flag <- liftIO (nullPtr x) flag <- liftIO (nullPtr x)
if flag if flag
then do x <- liftIO(get_error_table pointer) ; fail x then do x <- liftIO(get_error_table pointer) ; fail x
else return (MkTBPointer x) else return (MkTBPointer x)
where where
get_error_table : Ptr-> IO String get_error_table : Ptr-> IO String
get_error_table pointer = do x <- mkForeign (FFun "sqlite3_get_error" [FPtr] FString) pointer get_error_table pointer = do x <- foreign FFI_C "sqlite3_get_error" (Ptr -> IO String) pointer
return x return x
free_table : TBPointer -> IO () free_table : TBPointer -> IO ()
free_table (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_free_table_idr" [FPtr] FUnit) pointer free_table (MkTBPointer pointer) = do x <- foreign FFI_C "sqlite3_free_table_idr" (Ptr -> IO ()) pointer
return () return ()
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@ -267,11 +261,11 @@ free_table (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_free_table_i
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
num_row : TBPointer -> IO Int num_row : TBPointer -> IO Int
num_row (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row" [FPtr] FInt) pointer num_row (MkTBPointer pointer) = do x <- foreign FFI_C "sqlite3_get_num_row" (Ptr -> IO Int) pointer
return x return x
num_col : TBPointer -> IO Int num_col : TBPointer -> IO Int
num_col (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col" [FPtr] FInt) pointer num_col (MkTBPointer pointer) = do x <- foreign FFI_C "sqlite3_get_num_col" (Ptr -> IO Int) pointer
return x return x
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@ -280,11 +274,11 @@ num_col (MkTBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col" [F
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
num_row_v2 : DBPointer -> IO Int num_row_v2 : DBPointer -> IO Int
num_row_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_row_v2" [FPtr] FInt) pointer num_row_v2 (MkDBPointer pointer) = do x <- foreign FFI_C "sqlite3_get_num_row_v2" (Ptr -> IO Int) pointer
return x return x
num_col_v2 : DBPointer -> IO Int num_col_v2 : DBPointer -> IO Int
num_col_v2 (MkDBPointer pointer) = do x <- mkForeign (FFun "sqlite3_get_num_col_v2" [FPtr] FInt) pointer num_col_v2 (MkDBPointer pointer) = do x <- foreign FFI_C "sqlite3_get_num_col_v2" (Ptr -> IO Int) pointer
return x return x
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
@ -299,18 +293,18 @@ get_data (MkDBPointer pointer) row col = do
helper ty helper ty
where get_data_type : Ptr ->Int -> Int -> IO Int where get_data_type : Ptr ->Int -> Int -> IO Int
get_data_type pointer row col = get_data_type pointer row col =
mkForeign (FFun "sqlite3_get_data_type" [FPtr, FInt, FInt] FInt) pointer row col foreign FFI_C "sqlite3_get_data_type" (Ptr -> Int -> Int -> IO Int) pointer row col
get_data_val_int : Ptr -> Int -> IO Int get_data_val_int : Ptr -> Int -> IO Int
get_data_val_int pointer col = get_data_val_int pointer col =
mkForeign (FFun "sqlite3_get_val_int" [FPtr,FInt] FInt) pointer col foreign FFI_C "sqlite3_get_val_int" (Ptr -> Int -> IO Int) pointer col
get_data_val_text : Ptr -> Int -> IO String get_data_val_text : Ptr -> Int -> IO String
get_data_val_text pointer col = get_data_val_text pointer col =
mkForeign (FFun "sqlite3_get_val_text" [FPtr, FInt] FString) pointer col foreign FFI_C "sqlite3_get_val_text" (Ptr -> Int -> IO String) pointer col
get_data_val_float : Ptr -> Int -> IO Float get_data_val_float : Ptr -> Int -> IO Float
get_data_val_float pointer col = get_data_val_float pointer col =
mkForeign (FFun "sqlite3_get_float" [FPtr, FInt] FFloat) pointer col foreign FFI_C "sqlite3_get_float" (Ptr -> Int -> IO Float) pointer col
helper : Int -> IO DBVal helper : Int -> IO DBVal
helper 1 = do i <- get_data_val_int pointer col ; return (DBInt i) helper 1 = do i <- get_data_val_int pointer col ; return (DBInt i)
@ -360,7 +354,7 @@ strcat str1 str2 = str1 ++ str2
bind_int : StmtPtr -> Int -> Int -> DB StmtPtr bind_int : StmtPtr -> Int -> Int -> DB StmtPtr
bind_int (MkStmtPtr pointer) indexval val = do bind_int (MkStmtPtr pointer) indexval val = do
x <- liftIO (mkForeign (FFun "sqlite3_bind_int_idr" [FPtr, FInt, FInt] FPtr) pointer indexval val) x <- liftIO (foreign FFI_C "sqlite3_bind_int_idr" (Ptr -> Int -> Int -> IO Ptr) pointer indexval val)
flag <- liftIO (nullPtr x) flag <- liftIO (nullPtr x)
if flag if flag
then fail "Could not bind int." then fail "Could not bind int."
@ -369,7 +363,7 @@ bind_int (MkStmtPtr pointer) indexval val = do
bind_float : StmtPtr -> Int -> Float -> DB StmtPtr bind_float : StmtPtr -> Int -> Float -> DB StmtPtr
bind_float (MkStmtPtr pointer) indexval val = do bind_float (MkStmtPtr pointer) indexval val = do
x <- liftIO (mkForeign (FFun "sqlite3_bind_float_idr" [FPtr, FInt, FFloat] FPtr) pointer indexval val) x <- liftIO (foreign FFI_C "sqlite3_bind_float_idr" (Ptr -> Int -> Float -> IO Ptr) pointer indexval val)
flag <- liftIO (nullPtr x) flag <- liftIO (nullPtr x)
if flag if flag
then fail "Could not bind float." then fail "Could not bind float."
@ -377,7 +371,7 @@ bind_float (MkStmtPtr pointer) indexval val = do
bind_text : StmtPtr -> String -> Int -> Int -> DB StmtPtr bind_text : StmtPtr -> String -> Int -> Int -> DB StmtPtr
bind_text (MkStmtPtr pointer) text indexval lengthval = do bind_text (MkStmtPtr pointer) text indexval lengthval = do
x <- liftIO (mkForeign (FFun "sqlite3_bind_text_idr" [FPtr, FString, FInt, FInt] FPtr) x <- liftIO (foreign FFI_C "sqlite3_bind_text_idr" (Ptr -> String -> Int -> Int -> IO Ptr)
pointer text indexval lengthval) pointer text indexval lengthval)
flag <- liftIO(nullPtr x) flag <- liftIO(nullPtr x)
if flag if flag
@ -386,7 +380,7 @@ bind_text (MkStmtPtr pointer) text indexval lengthval = do
bind_null : StmtPtr -> Int -> DB StmtPtr bind_null : StmtPtr -> Int -> DB StmtPtr
bind_null (MkStmtPtr pointer) indexval = do bind_null (MkStmtPtr pointer) indexval = do
x <- liftIO (mkForeign (FFun "sqlite3_bind_null_idr" [FPtr, FInt] FPtr) pointer indexval) x <- liftIO (foreign FFI_C "sqlite3_bind_null_idr" (Ptr -> Int -> IO Ptr) pointer indexval)
flag <- liftIO (nullPtr x) flag <- liftIO (nullPtr x)
if flag if flag
then fail "Could not bind null." then fail "Could not bind null."
@ -397,7 +391,7 @@ bind_null (MkStmtPtr pointer) indexval = do
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
strlen : String -> DB Int strlen : String -> DB Int
strlen str = liftIO (mkForeign (FFun "strLength" [FString] FInt) str) strlen str = liftIO (foreign FFI_C "strLength" (String -> IO Int) str)
instance Show DBVal where instance Show DBVal where
show (DBInt i) = "Int val: " ++ show i ++ "\n" show (DBInt i) = "Int val: " ++ show i ++ "\n"

View File

@ -30,7 +30,7 @@ instance Functor Parser where
instance Applicative Parser where instance Applicative Parser where
pure v = P (\inp => Right (v, inp)) pure v = P (\inp => Right (v, inp))
a <$> b = P (\inp => do (f, rest) <- parse a inp a <*> b = P (\inp => do (f, rest) <- parse a inp
(x, rest') <- parse b rest (x, rest') <- parse b rest
pure ((f x), rest')) pure ((f x), rest'))

View File

@ -95,7 +95,7 @@ instance Arrow a => Functor (ArrowMonad a) where
instance Arrow a => Applicative (ArrowMonad a) where instance Arrow a => Applicative (ArrowMonad a) where
pure x = MkArrowMonad $ arrow $ \_ => x pure x = MkArrowMonad $ arrow $ \_ => x
(MkArrowMonad f) <$> (MkArrowMonad x) = MkArrowMonad $ f &&& x >>> arrow (uncurry id) (MkArrowMonad f) <*> (MkArrowMonad x) = MkArrowMonad $ f &&& x >>> arrow (uncurry id)
instance ArrowApply a => Monad (ArrowMonad a) where instance ArrowApply a => Monad (ArrowMonad a) where
(MkArrowMonad m) >>= f = (MkArrowMonad m) >>= f =

View File

@ -10,8 +10,8 @@ instance Functor (IOExcept e) where
instance Applicative (IOExcept e) where instance Applicative (IOExcept e) where
pure x = ioM (pure (pure x)) pure x = ioM (pure (pure x))
(ioM f) <$> (ioM a) = ioM (do f' <- f; a' <- a (ioM f) <*> (ioM a) = ioM (do f' <- f; a' <- a
return (f' <$> a')) return (f' <*> a'))
instance Monad (IOExcept e) where instance Monad (IOExcept e) where
(ioM x) >>= k = ioM (do x' <- x; (ioM x) >>= k = ioM (do x' <- x;

View File

@ -9,7 +9,7 @@ instance Functor Identity where
instance Applicative Identity where instance Applicative Identity where
pure x = Id x pure x = Id x
(Id f) <$> (Id g) = Id (f g) (Id f) <*> (Id g) = Id (f g)
instance Monad Identity where instance Monad Identity where
(Id x) >>= k = k x (Id x) >>= k = k x

View File

@ -21,7 +21,7 @@ instance Monad m => Functor (RWST r w s m) where
instance (Monoid w, Monad m) => Applicative (RWST r w s m) where instance (Monoid w, Monad m) => Applicative (RWST r w s m) where
pure a = MkRWST $ \_,s => return (a, s, neutral) pure a = MkRWST $ \_,s => return (a, s, neutral)
(MkRWST f) <$> (MkRWST v) = MkRWST $ \r,s => do (a, s', w) <- v r s (MkRWST f) <*> (MkRWST v) = MkRWST $ \r,s => do (a, s', w) <- v r s
(fn, ss, w') <- f r s (fn, ss, w') <- f r s
return (fn a, ss, w <+> w) return (fn a, ss, w <+> w)

View File

@ -27,7 +27,7 @@ instance Functor f => Functor (ReaderT r f) where
instance Applicative m => Applicative (ReaderT r m) where instance Applicative m => Applicative (ReaderT r m) where
pure = liftReaderT . pure pure = liftReaderT . pure
(RD f) <$> (RD v) = RD $ \r => f r <$> v r (RD f) <*> (RD v) = RD $ \r => f r <*> v r
instance Alternative m => Alternative (ReaderT r m) where instance Alternative m => Alternative (ReaderT r m) where
empty = liftReaderT empty empty = liftReaderT empty

View File

@ -25,7 +25,7 @@ instance Functor f => Functor (StateT s f) where
instance Monad f => Applicative (StateT s f) where instance Monad f => Applicative (StateT s f) where
pure x = ST (\st => pure (x, st)) pure x = ST (\st => pure (x, st))
(ST f) <$> (ST a) = ST (\st => do (g, r) <- f st (ST f) <*> (ST a) = ST (\st => do (g, r) <- f st
(b, t) <- a r (b, t) <- a r
return (g b, t)) return (g b, t))

View File

@ -25,7 +25,7 @@ instance Functor f => Functor (WriterT w f) where
instance (Monoid w, Applicative m) => Applicative (WriterT w m) where instance (Monoid w, Applicative m) => Applicative (WriterT w m) where
pure a = WR $ pure (a, neutral) pure a = WR $ pure (a, neutral)
(WR f) <$> (WR v) = WR $ liftA2 merge f v where (WR f) <*> (WR v) = WR $ liftA2 merge f v where
merge (fn, w) (a, w') = (fn a, w <+> w') merge (fn, w) (a, w') = (fn a, w <+> w')
instance (Monoid w, Alternative m) => Alternative (WriterT w m) where instance (Monoid w, Alternative m) => Alternative (WriterT w m) where

View File

@ -16,7 +16,7 @@ instance Functor Erased where
instance Applicative Erased where instance Applicative Erased where
pure = Erase pure = Erase
(<$>) (Erase f) (Erase x) = Erase (f x) (<*>) (Erase f) (Erase x) = Erase (f x)
instance Monad Erased where instance Monad Erased where
(>>=) (Erase x) f = f x (>>=) (Erase x) f = f x

View File

@ -7,13 +7,13 @@ import Data.Vect
%default total %default total
infixr 2 <.> -- vector inner product infixr 2 <:> -- vector inner product
infixr 2 >< -- vector outer product infixr 2 >< -- vector outer product
infixr 2 <<>> -- matrix commutator infixr 2 <<>> -- matrix commutator
infixr 2 >><< -- matrix anticommutator infixr 2 >><< -- matrix anticommutator
infixl 3 <\> -- row times a matrix infixl 3 <\> -- row times a matrix
infixr 4 </> -- matrix times a column infixr 4 </> -- matrix times a column
infixr 5 <> -- matrix multiplication infixr 5 <> -- matrix multiplication
infixr 7 \&\ -- vector tensor product infixr 7 \&\ -- vector tensor product
infixr 7 <&> -- matrix tensor product infixr 7 <&> -- matrix tensor product
@ -26,14 +26,14 @@ instance Semigroup a => Semigroup (Vect n a) where
instance Monoid a => Monoid (Vect n a) where instance Monoid a => Monoid (Vect n a) where
neutral {n} = replicate n neutral neutral {n} = replicate n neutral
instance Group a => Group (Vect n a) where instance Group a => Group (Vect n a) where
inverse = map inverse inverse = map inverse
instance AbelianGroup a => AbelianGroup (Vect n a) where {} instance AbelianGroup a => AbelianGroup (Vect n a) where {}
instance Ring a => Ring (Vect n a) where instance Ring a => Ring (Vect n a) where
(<*>) v w = zipWith (<*>) v w (<.>) v w = zipWith (<.>) v w
instance RingWithUnity a => RingWithUnity (Vect n a) where instance RingWithUnity a => RingWithUnity (Vect n a) where
unity {n} = replicate n unity unity {n} = replicate n unity
@ -42,7 +42,7 @@ instance Field a => Field (Vect n a) where
inverseM = map inverseM inverseM = map inverseM
instance RingWithUnity a => Module a (Vect n a) where instance RingWithUnity a => Module a (Vect n a) where
(<#>) r v = map (r <*>) v (<#>) r v = map (r <.>) v
instance RingWithUnity a => Module a (Vect n (Vect l a)) where instance RingWithUnity a => Module a (Vect n (Vect l a)) where
(<#>) r m = map (r <#>) m (<#>) r m = map (r <#>) m
@ -53,12 +53,12 @@ instance RingWithUnity a => Module a (Vect n (Vect l a)) where
----------------------------------------------------------------------- -----------------------------------------------------------------------
||| Inner product of ring vectors ||| Inner product of ring vectors
(<.>) : Ring a => Vect n a -> Vect n a -> a (<:>) : Ring a => Vect n a -> Vect n a -> a
(<.>) w v = foldr (<+>) neutral (zipWith (<*>) w v) (<:>) w v = foldr (<+>) neutral (zipWith (<.>) w v)
||| Tensor multiply (⊗) ring vectors ||| Tensor multiply (⊗) ring vectors
(\&\) : Ring a => Vect n a -> Vect m a -> Vect (n * m) a (\&\) : Ring a => Vect n a -> Vect m a -> Vect (n * m) a
(\&\) {n} {m} v w = zipWith (<*>) (oextend m v) (orep n w) where (\&\) {n} {m} v w = zipWith (<.>) (oextend m v) (orep n w) where
orep : (n : Nat) -> Vect m a -> Vect (n * m) a orep : (n : Nat) -> Vect m a -> Vect (n * m) a
orep n v = concat $ replicate n v orep n v = concat $ replicate n v
oextend : (n : Nat) -> Vect k a -> Vect (k * n) a oextend : (n : Nat) -> Vect k a -> Vect (k * n) a
@ -90,15 +90,15 @@ indices f1 f2 m = index f2 (index f1 m)
||| Matrix times a column vector ||| Matrix times a column vector
(</>) : Ring a => Matrix n m a -> Vect m a -> Vect n a (</>) : Ring a => Matrix n m a -> Vect m a -> Vect n a
(</>) m v = map (v <.>) m (</>) m v = map (v <:>) m
||| Matrix times a row vector ||| Matrix times a row vector
(<\>) : Ring a => Vect n a -> Matrix n m a -> Vect m a (<\>) : Ring a => Vect n a -> Matrix n m a -> Vect m a
(<\>) r m = map (r <.>) $ transpose m (<\>) r m = map (r <:>) $ transpose m
||| Matrix multiplication ||| Matrix multiplication
(<>) : Ring a => Matrix n k a -> (<>) : Ring a => Matrix n k a ->
Matrix k m a -> Matrix k m a ->
Matrix n m a Matrix n m a
(<>) m1 m2 = map (<\> m2) m1 (<>) m1 m2 = map (<\> m2) m1
@ -110,11 +110,11 @@ indices f1 f2 m = index f2 (index f1 m)
stepTwo : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w2 a stepTwo : Matrix h1 w1 a -> Matrix h2 w2 a -> Matrix (h1 * h2) w2 a
stepTwo {h1} m1 m2 = concat $ (Vect.replicate h1) m2 stepTwo {h1} m1 m2 = concat $ (Vect.replicate h1) m2
||| Cast a vector from a standard Vect to a proper n x 1 matrix ||| Cast a vector from a standard Vect to a proper n x 1 matrix
col : Vect n a -> Matrix n 1 a col : Vect n a -> Matrix n 1 a
col v = map (\x => [x]) v col v = map (\x => [x]) v
||| Cast a row from a standard Vect to a proper 1 x n matrix ||| Cast a row from a standard Vect to a proper 1 x n matrix
row : Vect n a -> Matrix 1 n a row : Vect n a -> Matrix 1 n a
row r = [r] row r = [r]
@ -157,11 +157,11 @@ instance Monoid Integer where
instance Group Integer where instance Group Integer where
inverse = (* -1) inverse = (* -1)
instance AbelianGroup Integer instance AbelianGroup Integer
instance Ring Integer where instance Ring Integer where
(<*>) = (*) (<.>) = (*)
instance RingWithUnity Integer where instance RingWithUnity Integer where
unity = 1 unity = 1
@ -175,11 +175,11 @@ instance Monoid Int where
instance Group Int where instance Group Int where
inverse = (* -1) inverse = (* -1)
instance AbelianGroup Int instance AbelianGroup Int
instance Ring Int where instance Ring Int where
(<*>) = (*) (<.>) = (*)
instance RingWithUnity Int where instance RingWithUnity Int where
unity = 1 unity = 1
@ -193,11 +193,11 @@ instance Monoid Float where
instance Group Float where instance Group Float where
inverse = (* -1) inverse = (* -1)
instance AbelianGroup Float instance AbelianGroup Float
instance Ring Float where instance Ring Float where
(<*>) = (*) (<.>) = (*)
instance RingWithUnity Float where instance RingWithUnity Float where
unity = 1 unity = 1
@ -211,7 +211,7 @@ instance Semigroup Nat where
instance Monoid Nat where instance Monoid Nat where
neutral = 0 neutral = 0
instance VerifiedSemigroup Nat where instance VerifiedSemigroup Nat where
semigroupOpIsAssociative = plusAssociative semigroupOpIsAssociative = plusAssociative
@ -228,12 +228,12 @@ instance Monoid ZZ where
instance Group ZZ where instance Group ZZ where
inverse = (* -1) inverse = (* -1)
instance AbelianGroup ZZ instance AbelianGroup ZZ
instance Ring ZZ where instance Ring ZZ where
(<*>) = (*) (<.>) = (*)
instance RingWithUnity ZZ where instance RingWithUnity ZZ where
unity = 1 unity = 1
@ -250,7 +250,7 @@ instance Group a => Group (Complex a) where
instance Ring a => AbelianGroup (Complex a) where {} instance Ring a => AbelianGroup (Complex a) where {}
instance Ring a => Ring (Complex a) where instance Ring a => Ring (Complex a) where
(<*>) (a :+ b) (c :+ d) = (a <*> c <-> b <*> d) :+ (a <*> d <+> b <*> c) (<.>) (a :+ b) (c :+ d) = (a <.> c <-> b <.> d) :+ (a <.> d <+> b <.> c)
instance RingWithUnity a => RingWithUnity (Complex a) where instance RingWithUnity a => RingWithUnity (Complex a) where
unity = (unity :+ neutral) unity = (unity :+ neutral)

View File

@ -25,7 +25,7 @@ instance Functor (Morphism r) where
instance Applicative (Morphism r) where instance Applicative (Morphism r) where
pure a = Mor $ const a pure a = Mor $ const a
(Mor f) <$> (Mor a) = Mor $ \r => f r $ a r (Mor f) <*> (Mor a) = Mor $ \r => f r $ a r
instance Monad (Morphism r) where instance Monad (Morphism r) where
(Mor h) >>= f = Mor $ \r => applyMor (f $ h r) r (Mor h) >>= f = Mor $ \r => applyMor (f $ h r) r

View File

@ -529,7 +529,7 @@ transpose (x :: xs) = zipWith (::) x (transpose xs)
instance Applicative (Vect k) where instance Applicative (Vect k) where
pure = replicate _ pure = replicate _
fs <$> vs = zipWith apply fs vs fs <*> vs = zipWith apply fs vs
instance Monad (Vect n) where instance Monad (Vect n) where
m >>= f = diag (map f m) m >>= f = diag (map f m)

View File

@ -36,7 +36,7 @@ instance Functor CGI where
instance Applicative CGI where instance Applicative CGI where
pure v = MkCGI (\s => return (v, s)) pure v = MkCGI (\s => return (v, s))
(MkCGI a) <$> (MkCGI b) = MkCGI (\s => do (f, i) <- a s (MkCGI a) <*> (MkCGI b) = MkCGI (\s => do (f, i) <- a s
(c, j) <- b i (c, j) <- b i
return (f c, j)) return (f c, j))

View File

@ -17,9 +17,9 @@ instance Functor Provider where
map f (Error err) = Error err map f (Error err) = Error err
instance Applicative Provider where instance Applicative Provider where
(Provide f) <$> (Provide x) = Provide (f x) (Provide f) <*> (Provide x) = Provide (f x)
(Provide f) <$> (Error err) = Error err (Provide f) <*> (Error err) = Error err
(Error err) <$> _ = Error err (Error err) <*> _ = Error err
pure = Provide pure = Provide
instance Monad Provider where instance Monad Provider where

View File

@ -19,7 +19,7 @@ instance Functor (Process msg) where
instance Applicative (Process msg) where instance Applicative (Process msg) where
pure = Lift . return pure = Lift . return
(Lift f) <$> (Lift a) = Lift (f <$> a) (Lift f) <*> (Lift a) = Lift (f <*> a)
instance Monad (Process msg) where instance Monad (Process msg) where
(Lift io) >>= k = Lift (do x <- io (Lift io) >>= k = Lift (do x <- io

View File

@ -24,11 +24,11 @@ data RawMemory : Effect where
(size : Nat) -> (size : Nat) ->
So (offset + size <= i) -> So (offset + size <= i) ->
RawMemory (Vect size Bits8) RawMemory (Vect size Bits8)
(MemoryChunk n i) (\v => MemoryChunk n i) (MemoryChunk n i) (\v => MemoryChunk n i)
Poke : (offset : Nat) -> Poke : (offset : Nat) ->
(Vect size Bits8) -> (Vect size Bits8) ->
So (offset <= i && offset + size <= n) -> So (offset <= i && offset + size <= n) ->
RawMemory () (MemoryChunk n i) (\v => MemoryChunk n (max i (offset + size))) RawMemory () (MemoryChunk n i) (\v => MemoryChunk n (max i (offset + size)))
Move : (src : MemoryChunk src_size src_init) -> Move : (src : MemoryChunk src_size src_init) ->
(dst_offset : Nat) -> (dst_offset : Nat) ->
(src_offset : Nat) -> (src_offset : Nat) ->
@ -36,8 +36,8 @@ data RawMemory : Effect where
So (dst_offset <= dst_init && dst_offset + size <= dst_size) -> So (dst_offset <= dst_init && dst_offset + size <= dst_size) ->
So (src_offset + size <= src_init) -> So (src_offset + size <= src_init) ->
RawMemory () (MemoryChunk dst_size dst_init) RawMemory () (MemoryChunk dst_size dst_init)
(\v => MemoryChunk dst_size (max dst_init (dst_offset + size))) (\v => MemoryChunk dst_size (max dst_init (dst_offset + size)))
GetRawPtr : RawMemory (MemoryChunk n i) (MemoryChunk n i) (\v => MemoryChunk n i) GetRawPtr : RawMemory (MemoryChunk n i) (MemoryChunk n i) (\v => MemoryChunk n i)
private private
do_malloc : Nat -> IOExcept String Ptr do_malloc : Nat -> IOExcept String Ptr
@ -84,9 +84,9 @@ instance Handler RawMemory (IOExcept String) where
= do ptr <- do_malloc n = do ptr <- do_malloc n
k () (CH ptr) k () (CH ptr)
handle {-{res = MemoryChunk _ offset}-} (CH ptr) (Initialize {i} c size _) k handle {-{res = MemoryChunk _ offset}-} (CH ptr) (Initialize {i} c size _) k
= ioe_lift (do_memset ptr i c size) $> k () (CH ptr) = ioe_lift (do_memset ptr i c size) *> k () (CH ptr)
handle (CH ptr) (Free) k handle (CH ptr) (Free) k
= ioe_lift (do_free ptr) $> k () () = ioe_lift (do_free ptr) *> k () ()
handle (CH ptr) (Peek offset size _) k handle (CH ptr) (Peek offset size _) k
= do res <- ioe_lift (do_peek ptr offset size) = do res <- ioe_lift (do_peek ptr offset size)
k res (CH ptr) k res (CH ptr)
@ -102,7 +102,7 @@ instance Handler RawMemory (IOExcept String) where
RAW_MEMORY : Type -> EFFECT RAW_MEMORY : Type -> EFFECT
RAW_MEMORY t = MkEff t RawMemory RAW_MEMORY t = MkEff t RawMemory
allocate : (n : Nat) -> allocate : (n : Nat) ->
Eff () [RAW_MEMORY ()] (\v => [RAW_MEMORY (MemoryChunk n 0)]) Eff () [RAW_MEMORY ()] (\v => [RAW_MEMORY (MemoryChunk n 0)])
allocate size = call $ Allocate size allocate size = call $ Allocate size
@ -111,7 +111,7 @@ initialize : {i : Nat} ->
Bits8 -> Bits8 ->
(size : Nat) -> (size : Nat) ->
So (i + size <= n) -> So (i + size <= n) ->
Eff () [RAW_MEMORY (MemoryChunk n i)] Eff () [RAW_MEMORY (MemoryChunk n i)]
(\v => [RAW_MEMORY (MemoryChunk n (i + size))]) (\v => [RAW_MEMORY (MemoryChunk n (i + size))])
initialize c size prf = call $ Initialize c size prf initialize c size prf = call $ Initialize c size prf
@ -122,7 +122,7 @@ peek : {i : Nat} ->
(offset : Nat) -> (offset : Nat) ->
(size : Nat) -> (size : Nat) ->
So (offset + size <= i) -> So (offset + size <= i) ->
{ [RAW_MEMORY (MemoryChunk n i)] } Eff (Vect size Bits8) { [RAW_MEMORY (MemoryChunk n i)] } Eff (Vect size Bits8)
peek offset size prf = call $ Peek offset size prf peek offset size prf = call $ Peek offset size prf
poke : {n : Nat} -> poke : {n : Nat} ->
@ -130,12 +130,12 @@ poke : {n : Nat} ->
(offset : Nat) -> (offset : Nat) ->
Vect size Bits8 -> Vect size Bits8 ->
So (offset <= i && offset + size <= n) -> So (offset <= i && offset + size <= n) ->
Eff () [RAW_MEMORY (MemoryChunk n i)] Eff () [RAW_MEMORY (MemoryChunk n i)]
(\v => [RAW_MEMORY (MemoryChunk n (max i (offset + size)))]) (\v => [RAW_MEMORY (MemoryChunk n (max i (offset + size)))])
poke offset content prf = call $ Poke offset content prf poke offset content prf = call $ Poke offset content prf
private private
getRawPtr : { [RAW_MEMORY (MemoryChunk n i)] } Eff (MemoryChunk n i) getRawPtr : { [RAW_MEMORY (MemoryChunk n i)] } Eff (MemoryChunk n i)
getRawPtr = call $ GetRawPtr getRawPtr = call $ GetRawPtr
private private
@ -173,5 +173,5 @@ move : {dst_size : Nat} ->
move dst_offset src_offset size dst_bounds src_bounds move dst_offset src_offset size dst_bounds src_bounds
= do src_ptr <- Src :- getRawPtr = do src_ptr <- Src :- getRawPtr
Dst :- move' src_ptr dst_offset src_offset size dst_bounds src_bounds Dst :- move' src_ptr dst_offset src_offset size dst_bounds src_bounds
return () return ()

View File

@ -11,7 +11,7 @@ using (xs : List EFFECT, m : Type -> Type)
instance Applicative (\a => EffM m a xs (\v => xs)) where instance Applicative (\a => EffM m a xs (\v => xs)) where
pure = value pure = value
(<$>) f a = do f' <- f (<*>) f a = do f' <- f
a' <- a a' <- a
value (f' a') value (f' a')

View File

@ -174,7 +174,7 @@ return x = value x
-- ------------------------------------------------------ [ for idiom brackets ] -- ------------------------------------------------------ [ for idiom brackets ]
infixl 2 <$> infixl 2 <*>
pure : a -> Eff a xs (\v => xs) pure : a -> Eff a xs (\v => xs)
pure = value pure = value
@ -182,9 +182,9 @@ pure = value
pureM : (val : a) -> Eff a (xs val) xs pureM : (val : a) -> Eff a (xs val) xs
pureM = value pureM = value
(<$>) : Eff (a -> b) xs (\v => xs) -> (<*>) : Eff (a -> b) xs (\v => xs) ->
Eff a xs (\v => xs) -> Eff b xs (\v => xs) Eff a xs (\v => xs) -> Eff b xs (\v => xs)
(<$>) prog v = do fn <- prog (<*>) prog v = do fn <- prog
arg <- v arg <- v
return (fn arg) return (fn arg)

View File

@ -11,7 +11,7 @@ using (xs : List EFFECT, m : Type -> Type)
instance Applicative (\a => EffM m a xs (\v => xs)) where instance Applicative (\a => EffM m a xs (\v => xs)) where
pure = value pure = value
(<$>) f a = do f' <- f (<*>) f a = do f' <- f
a' <- a a' <- a
value (f' a') value (f' a')

View File

@ -185,16 +185,16 @@ return x = value x
-- ------------------------------------------------------ [ for idiom brackets ] -- ------------------------------------------------------ [ for idiom brackets ]
infixl 2 <$> infixl 2 <*>
pure : a -> Eff m a xs (\v => xs) pure : a -> Eff m a xs (\v => xs)
pure = value pure = value
syntax pureM [val] = with_val val (pure ()) syntax pureM [val] = with_val val (pure ())
(<$>) : Eff m (a -> b) xs (\v => xs) -> (<*>) : Eff m (a -> b) xs (\v => xs) ->
Eff m a xs (\v => xs) -> Eff m b xs (\v => xs) Eff m a xs (\v => xs) -> Eff m b xs (\v => xs)
(<$>) prog v = do fn <- prog (<*>) prog v = do fn <- prog
arg <- v arg <- v
return (fn arg) return (fn arg)

View File

@ -45,7 +45,7 @@ instance Functor Tactical where
instance Applicative Tactical where instance Applicative Tactical where
pure x = prim__PureTactical x pure x = prim__PureTactical x
f <$> x = prim__BindTactical f $ \g => f <*> x = prim__BindTactical f $ \g =>
prim__BindTactical x $ \y => prim__BindTactical x $ \y =>
prim__PureTactical $ g y prim__PureTactical $ g y

View File

@ -249,31 +249,31 @@ instance Functor (Either e) where
instance Applicative PrimIO where instance Applicative PrimIO where
pure = prim_io_return pure = prim_io_return
am <$> bm = prim_io_bind am (\f => prim_io_bind bm (prim_io_return . f)) am <*> bm = prim_io_bind am (\f => prim_io_bind bm (prim_io_return . f))
instance Applicative (IO' ffi) where instance Applicative (IO' ffi) where
pure x = io_return x pure x = io_return x
f <$> a = io_bind f (\f' => f <*> a = io_bind f (\f' =>
io_bind a (\a' => io_bind a (\a' =>
io_return (f' a'))) io_return (f' a')))
instance Applicative Maybe where instance Applicative Maybe where
pure = Just pure = Just
(Just f) <$> (Just a) = Just (f a) (Just f) <*> (Just a) = Just (f a)
_ <$> _ = Nothing _ <*> _ = Nothing
instance Applicative (Either e) where instance Applicative (Either e) where
pure = Right pure = Right
(Left a) <$> _ = Left a (Left a) <*> _ = Left a
(Right f) <$> (Right r) = Right (f r) (Right f) <*> (Right r) = Right (f r)
(Right _) <$> (Left l) = Left l (Right _) <*> (Left l) = Left l
instance Applicative List where instance Applicative List where
pure x = [x] pure x = [x]
fs <$> vs = concatMap (\f => map f vs) fs fs <*> vs = concatMap (\f => map f vs) fs
---- Alternative instances ---- Alternative instances

View File

@ -5,7 +5,7 @@ import Builtins
-- XXX: change? -- XXX: change?
infixl 6 <-> infixl 6 <->
infixl 6 <+> infixl 6 <+>
infixl 6 <*> infixl 6 <.>
infixl 5 <#> infixl 5 <#>
%access public %access public
@ -96,18 +96,18 @@ class (VerifiedGroup a, AbelianGroup a) => VerifiedAbelianGroup a where
||| + Inverse for `<+>`: ||| + Inverse for `<+>`:
||| forall a, a <+> inverse a == neutral ||| forall a, a <+> inverse a == neutral
||| forall a, inverse a <+> a == neutral ||| forall a, inverse a <+> a == neutral
||| + Associativity of `<*>`: ||| + Associativity of `<.>`:
||| forall a b c, a <*> (b <*> c) == (a <*> b) <*> c ||| forall a b c, a <.> (b <.> c) == (a <.> b) <.> c
||| + Distributivity of `<*>` and `<->`: ||| + Distributivity of `<.>` and `<->`:
||| forall a b c, a <*> (b <+> c) == (a <*> b) <+> (a <*> c) ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c)
||| forall a b c, (a <+> b) <*> c == (a <*> c) <+> (b <*> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c)
class AbelianGroup a => Ring a where class AbelianGroup a => Ring a where
(<*>) : a -> a -> a (<.>) : a -> a -> a
class (VerifiedAbelianGroup a, Ring a) => VerifiedRing a where class (VerifiedAbelianGroup a, Ring a) => VerifiedRing a where
total ringOpIsAssociative : (l, c, r : a) -> l <*> (c <*> r) = (l <*> c) <*> r total ringOpIsAssociative : (l, c, r : a) -> l <.> (c <.> r) = (l <.> c) <.> r
total ringOpIsDistributiveL : (l, c, r : a) -> l <*> (c <+> r) = (l <*> c) <+> (l <*> r) total ringOpIsDistributiveL : (l, c, r : a) -> l <.> (c <+> r) = (l <.> c) <+> (l <.> r)
total ringOpIsDistributiveR : (l, c, r : a) -> (l <+> c) <*> r = (l <*> r) <+> (c <*> r) total ringOpIsDistributiveR : (l, c, r : a) -> (l <+> c) <.> r = (l <.> r) <+> (c <.> r)
||| Sets equipped with two binary operations, one associative and commutative ||| Sets equipped with two binary operations, one associative and commutative
||| supplied with a neutral element, and the other associative supplied with a ||| supplied with a neutral element, and the other associative supplied with a
@ -124,20 +124,20 @@ class (VerifiedAbelianGroup a, Ring a) => VerifiedRing a where
||| + Inverse for `<+>`: ||| + Inverse for `<+>`:
||| forall a, a <+> inverse a == neutral ||| forall a, a <+> inverse a == neutral
||| forall a, inverse a <+> a == neutral ||| forall a, inverse a <+> a == neutral
||| + Associativity of `<*>`: ||| + Associativity of `<.>`:
||| forall a b c, a <*> (b <*> c) == (a <*> b) <*> c ||| forall a b c, a <.> (b <.> c) == (a <.> b) <.> c
||| + Neutral for `<*>`: ||| + Neutral for `<.>`:
||| forall a, a <*> unity == a ||| forall a, a <.> unity == a
||| forall a, unity <*> a == a ||| forall a, unity <.> a == a
||| + Distributivity of `<*>` and `<->`: ||| + Distributivity of `<.>` and `<->`:
||| forall a b c, a <*> (b <+> c) == (a <*> b) <+> (a <*> c) ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c)
||| forall a b c, (a <+> b) <*> c == (a <*> c) <+> (b <*> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c)
class Ring a => RingWithUnity a where class Ring a => RingWithUnity a where
unity : a unity : a
class (VerifiedRing a, RingWithUnity a) => VerifiedRingWithUnity a where class (VerifiedRing a, RingWithUnity a) => VerifiedRingWithUnity a where
total ringWithUnityIsUnityL : (l : a) -> l <*> unity = l total ringWithUnityIsUnityL : (l : a) -> l <.> unity = l
total ringWithUnityIsUnityR : (r : a) -> unity <*> r = r total ringWithUnityIsUnityR : (r : a) -> unity <.> r = r
||| Sets equipped with a binary operation that is commutative, associative and ||| Sets equipped with a binary operation that is commutative, associative and
||| idempotent. Must satisfy the following laws: ||| idempotent. Must satisfy the following laws:
@ -281,31 +281,31 @@ class (VerifiedBoundedJoinSemilattice a, VerifiedBoundedMeetSemilattice a, Verif
||| + Inverse for `<+>`: ||| + Inverse for `<+>`:
||| forall a, a <+> inverse a == neutral ||| forall a, a <+> inverse a == neutral
||| forall a, inverse a <+> a == neutral ||| forall a, inverse a <+> a == neutral
||| + Associativity of `<*>`: ||| + Associativity of `<.>`:
||| forall a b c, a <*> (b <*> c) == (a <*> b) <*> c ||| forall a b c, a <.> (b <.> c) == (a <.> b) <.> c
||| + Unity for `<*>`: ||| + Unity for `<.>`:
||| forall a, a <*> unity == a ||| forall a, a <.> unity == a
||| forall a, unity <*> a == a ||| forall a, unity <.> a == a
||| + InverseM of `<*>`: ||| + InverseM of `<.>`:
||| forall a, a <*> inverseM a == unity ||| forall a, a <.> inverseM a == unity
||| forall a, inverseM a <*> a == unity ||| forall a, inverseM a <.> a == unity
||| + Distributivity of `<*>` and `<->`: ||| + Distributivity of `<.>` and `<->`:
||| forall a b c, a <*> (b <+> c) == (a <*> b) <+> (a <*> c) ||| forall a b c, a <.> (b <+> c) == (a <.> b) <+> (a <.> c)
||| forall a b c, (a <+> b) <*> c == (a <*> c) <+> (b <*> c) ||| forall a b c, (a <+> b) <.> c == (a <.> c) <+> (b <.> c)
class RingWithUnity a => Field a where class RingWithUnity a => Field a where
inverseM : a -> a inverseM : a -> a
class (VerifiedRing a, Field a) => VerifiedField a where class (VerifiedRing a, Field a) => VerifiedField a where
total fieldInverseIsInverseL : (l : a) -> l <*> inverseM l = unity total fieldInverseIsInverseL : (l : a) -> l <.> inverseM l = unity
total fieldInverseIsInverseR : (r : a) -> inverseM r <*> r = unity total fieldInverseIsInverseR : (r : a) -> inverseM r <.> r = unity
||| A module over a ring is an additive abelian group of 'vectors' endowed with a ||| A module over a ring is an additive abelian group of 'vectors' endowed with a
||| scale operation multiplying vectors by ring elements, and distributivity laws ||| scale operation multiplying vectors by ring elements, and distributivity laws
||| relating the scale operation to both ring addition and module addition. ||| relating the scale operation to both ring addition and module addition.
||| Must satisfy the following laws: ||| Must satisfy the following laws:
||| |||
||| + Compatibility of scalar multiplication with ring multiplication: ||| + Compatibility of scalar multiplication with ring multiplication:
||| forall a b v, a <#> (b <#> v) = (a <*> b) <#> v ||| forall a b v, a <#> (b <#> v) = (a <.> b) <#> v
||| + Ring unity is the identity element of scalar multiplication: ||| + Ring unity is the identity element of scalar multiplication:
||| forall v, unity <#> v = v ||| forall v, unity <#> v = v
||| + Distributivity of `<#>` and `<+>`: ||| + Distributivity of `<#>` and `<+>`:
@ -315,7 +315,7 @@ class (RingWithUnity a, AbelianGroup b) => Module a b where
(<#>) : a -> b -> b (<#>) : a -> b -> b
class (VerifiedRingWithUnity a, VerifiedAbelianGroup b, Module a b) => VerifiedModule a b where class (VerifiedRingWithUnity a, VerifiedAbelianGroup b, Module a b) => VerifiedModule a b where
total moduleScalarMultiplyComposition : (x,y : a) -> (v : b) -> x <#> (y <#> v) = (x <*> y) <#> v total moduleScalarMultiplyComposition : (x,y : a) -> (v : b) -> x <#> (y <#> v) = (x <.> y) <#> v
total moduleScalarUnityIsUnity : (v : b) -> unity <#> v = v total moduleScalarUnityIsUnity : (v : b) -> unity <#> v = v
total moduleScalarMultDistributiveWRTVectorAddition : (s : a) -> (v, w : b) -> s <#> (v <+> w) = (s <#> v) <+> (s <#> w) total moduleScalarMultDistributiveWRTVectorAddition : (s : a) -> (v, w : b) -> s <#> (v <+> w) = (s <#> v) <+> (s <#> w)
total moduleScalarMultDistributiveWRTModuleAddition : (s, t : a) -> (v : b) -> (s <+> t) <#> v = (s <#> v) <+> (t <#> v) total moduleScalarMultDistributiveWRTModuleAddition : (s, t : a) -> (v : b) -> (s <+> t) <#> v = (s <#> v) <+> (t <#> v)

View File

@ -9,46 +9,46 @@ import Prelude.Functor
---- Applicative functors/Idioms ---- Applicative functors/Idioms
infixl 2 <$> infixl 2 <*>
class Functor f => Applicative (f : Type -> Type) where class Functor f => Applicative (f : Type -> Type) where
pure : a -> f a pure : a -> f a
(<$>) : f (a -> b) -> f a -> f b (<*>) : f (a -> b) -> f a -> f b
instance Applicative id where instance Applicative id where
pure a = a pure a = a
f <$> a = f a f <*> a = f a
class (Applicative f, VerifiedFunctor f) => VerifiedApplicative (f : Type -> Type) where class (Applicative f, VerifiedFunctor f) => VerifiedApplicative (f : Type -> Type) where
applicativeMap : (x : f a) -> (g : a -> b) -> applicativeMap : (x : f a) -> (g : a -> b) ->
map g x = pure g <$> x map g x = pure g <*> x
applicativeIdentity : (x : f a) -> pure id <$> x = x applicativeIdentity : (x : f a) -> pure id <*> x = x
applicativeComposition : (x : f a) -> (g1 : f (a -> b)) -> (g2 : f (b -> c)) -> applicativeComposition : (x : f a) -> (g1 : f (a -> b)) -> (g2 : f (b -> c)) ->
((pure (.) <$> g2) <$> g1) <$> x = g2 <$> (g1 <$> x) ((pure (.) <*> g2) <*> g1) <*> x = g2 <*> (g1 <*> x)
applicativeHomomorphism : (x : a) -> (g : a -> b) -> applicativeHomomorphism : (x : a) -> (g : a -> b) ->
(<$>) {f} (pure g) (pure x) = pure {f} (g x) (<*>) {f} (pure g) (pure x) = pure {f} (g x)
applicativeInterchange : (x : a) -> (g : f (a -> b)) -> applicativeInterchange : (x : a) -> (g : f (a -> b)) ->
g <$> pure x = pure (\g' : a -> b => g' x) <$> g g <*> pure x = pure (\g' : a -> b => g' x) <*> g
infixl 2 <$ infixl 2 <*
(<$) : Applicative f => f a -> f b -> f a (<*) : Applicative f => f a -> f b -> f a
a <$ b = map const a <$> b a <* b = map const a <*> b
infixl 2 $> infixl 2 *>
($>) : Applicative f => f a -> f b -> f b (*>) : Applicative f => f a -> f b -> f b
a $> b = map (const id) a <$> b a *> b = map (const id) a <*> b
||| Lift a function to an applicative ||| Lift a function to an applicative
liftA : Applicative f => (a -> b) -> f a -> f b liftA : Applicative f => (a -> b) -> f a -> f b
liftA f a = pure f <$> a liftA f a = pure f <*> a
||| Lift a two-argument function to an applicative ||| Lift a two-argument function to an applicative
liftA2 : Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA2 : Applicative f => (a -> b -> c) -> f a -> f b -> f c
liftA2 f a b = (map f a) <$> b liftA2 f a b = (map f a) <*> b
||| Lift a three-argument function to an applicative ||| Lift a three-argument function to an applicative
liftA3 : Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d liftA3 : Applicative f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 f a b c = (map f a) <$> b <$> c liftA3 f a b c = (map f a) <*> b <*> c
infixl 3 <|> infixl 3 <|>
class Applicative f => Alternative (f : Type -> Type) where class Applicative f => Alternative (f : Type -> Type) where

View File

@ -10,6 +10,14 @@ class Functor (f : Type -> Type) where
||| @ m the morphism ||| @ m the morphism
map : (m : a -> b) -> f a -> f b map : (m : a -> b) -> f a -> f b
infixl 4 <$>
||| An infix alias for `map`: the action of a functor on morphisms.
||| @ f the functor
||| @ m the morphism
(<$>) : Functor f => (m : a -> b) -> f a -> f b
m <$> x = map m x
class Functor f => VerifiedFunctor (f : Type -> Type) where class Functor f => VerifiedFunctor (f : Type -> Type) where
functorIdentity : {a : Type} -> (x : f a) -> map id x = id x functorIdentity : {a : Type} -> (x : f a) -> map id x = id x
functorComposition : {a : Type} -> {b : Type} -> (x : f a) -> functorComposition : {a : Type} -> {b : Type} -> (x : f a) ->

View File

@ -16,7 +16,7 @@ class Applicative m => Monad (m : Type -> Type) where
class (Monad m, VerifiedApplicative m) => VerifiedMonad (m : Type -> Type) where class (Monad m, VerifiedApplicative m) => VerifiedMonad (m : Type -> Type) where
monadApplicative : (mf : m (a -> b)) -> (mx : m a) -> monadApplicative : (mf : m (a -> b)) -> (mx : m a) ->
mf <$> mx = mf >>= \f => mf <*> mx = mf >>= \f =>
mx >>= \x => mx >>= \x =>
pure (f x) pure (f x)
monadLeftIdentity : (x : a) -> (f : a -> m b) -> return x >>= f = f x monadLeftIdentity : (x : a) -> (f : a -> m b) -> return x >>= f = f x

View File

@ -111,7 +111,7 @@ scanr f (x :: xs) = f x (foldr f xs) :: scanr f xs
instance Applicative Stream where instance Applicative Stream where
pure = repeat pure = repeat
(<$>) = zipWith apply (<*>) = zipWith apply
instance Monad Stream where instance Monad Stream where
s >>= f = diag (map f s) s >>= f = diag (map f s)

View File

@ -8,10 +8,10 @@ import Prelude.Foldable
import Prelude.Functor import Prelude.Functor
traverse_ : (Foldable t, Applicative f) => (a -> f b) -> t a -> f () traverse_ : (Foldable t, Applicative f) => (a -> f b) -> t a -> f ()
traverse_ f = foldr (($>) . f) (pure ()) traverse_ f = foldr ((*>) . f) (pure ())
sequence_ : (Foldable t, Applicative f) => t (f a) -> f () sequence_ : (Foldable t, Applicative f) => t (f a) -> f ()
sequence_ = foldr ($>) (pure ()) sequence_ = foldr (*>) (pure ())
for_ : (Foldable t, Applicative f) => t a -> (a -> f b) -> f () for_ : (Foldable t, Applicative f) => t a -> (a -> f b) -> f ()
for_ = flip traverse_ for_ = flip traverse_

View File

@ -18,7 +18,7 @@ endif
endif endif
ifeq ($(OS), windows) ifeq ($(OS), windows)
OBJS += windows/idris_stdfgn.o windows/idris_net.o OBJS += windows/idris_stdfgn.o windows/idris_net.o windows/win_utils.o
else else
OBJS += idris_stdfgn.o idris_net.o OBJS += idris_stdfgn.o idris_net.o
endif endif

View File

@ -5,9 +5,12 @@
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include <io.h>
extern char** environ; extern char** environ;
int win_fpoll(void* h);
void putStr(char* str) { void putStr(char* str) {
printf("%s", str); printf("%s", str);
} }
@ -32,14 +35,18 @@ int fileError(void* h) {
return ferror(f); return ferror(f);
} }
void fputStr(void* h, char* str) { int idris_writeStr(void* h, char* str) {
FILE* f = (FILE*)h; FILE* f = (FILE*)h;
fputs(str, f); if (fputs(str, f)) {
return 0;
} else {
return -1;
}
} }
int fpoll(void* h) int fpoll(void* h)
{ {
return 0; return win_fpoll(h);
} }
void* do_popen(const char* cmd, const char* mode) { void* do_popen(const char* cmd, const char* mode) {

21
rts/windows/win_utils.c Normal file
View File

@ -0,0 +1,21 @@
#include <windows.h>
#include <io.h>
#include <stdio.h>
// THis file exists to avoid clashes between windows.h and idris_rts.h
//
int win_fpoll(void* h)
{
HANDLE wh =(HANDLE) _get_osfhandle(_fileno((FILE*)h));
if (wh == INVALID_HANDLE_VALUE) {
return -1;
}
DWORD ret = WaitForSingleObject(wh, 1000);
// Imitate the return values of select()
if (ret == WAIT_OBJECT_0)
return 1;
if (ret == WAIT_TIMEOUT)
return 0;
return -1;
}

View File

@ -37,8 +37,8 @@ using (G : Vect n Ty)
index_first = stop index_first = stop
index_next = pop index_next = pop
(<$>) : |(f : Expr G (TyFun a t)) -> Expr G a -> Expr G t (<*>) : |(f : Expr G (TyFun a t)) -> Expr G a -> Expr G t
(<$>) = \f, a => App f a (<*>) = \f, a => App f a
pure : Expr G a -> Expr G a pure : Expr G a -> Expr G a
pure = id pure = id

View File

@ -1714,6 +1714,10 @@ stripLinear i tm = evalState (sl tm) [] where
return (a' : as') return (a' : as')
slAlts ns [] = return [] slAlts ns [] = return []
sl (PPair fc p l r) = do l' <- sl l; r' <- sl r; return (PPair fc p l' r') sl (PPair fc p l r) = do l' <- sl l; r' <- sl r; return (PPair fc p l' r')
sl (PDPair fc p l t r) = do l' <- sl l
t' <- sl t
r' <- sl r
return (PDPair fc p l' t' r')
sl (PApp fc fn args) = do -- Just the args, fn isn't matchable as a var sl (PApp fc fn args) = do -- Just the args, fn isn't matchable as a var
args' <- mapM slA args args' <- mapM slA args
return $ PApp fc fn args' return $ PApp fc fn args'
@ -1978,8 +1982,11 @@ shadow :: Name -> Name -> PTerm -> PTerm
shadow n n' t = sm t where shadow n n' t = sm t where
sm (PRef fc x) | n == x = PRef fc n' sm (PRef fc x) | n == x = PRef fc n'
sm (PLam fc x t sc) | n /= x = PLam fc x (sm t) (sm sc) sm (PLam fc x t sc) | n /= x = PLam fc x (sm t) (sm sc)
sm (PPi p x t sc) | n /=x = PPi p x (sm t) (sm sc) | otherwise = PLam fc x (sm t) sc
sm (PPi p x t sc) | n /= x = PPi p x (sm t) (sm sc)
| otherwise = PPi p x (sm t) sc
sm (PLet fc x t v sc) | n /= x = PLet fc x (sm t) (sm v) (sm sc) sm (PLet fc x t v sc) | n /= x = PLet fc x (sm t) (sm v) (sm sc)
| otherwise = PLet fc x (sm t) (sm v) sc
sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as) sm (PApp f x as) = PApp f (sm x) (map (fmap sm) as)
sm (PAppBind f x as) = PAppBind f (sm x) (map (fmap sm) as) sm (PAppBind f x as) = PAppBind f (sm x) (map (fmap sm) as)
sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as) sm (PCase f x as) = PCase f (sm x) (map (pmap sm) as)

View File

@ -1157,7 +1157,7 @@ updateSyntaxRules rules (SyntaxRules sr) = SyntaxRules newRules
initDSL = DSL (PRef f (sUN ">>=")) initDSL = DSL (PRef f (sUN ">>="))
(PRef f (sUN "return")) (PRef f (sUN "return"))
(PRef f (sUN "<$>")) (PRef f (sUN "<*>"))
(PRef f (sUN "pure")) (PRef f (sUN "pure"))
Nothing Nothing
Nothing Nothing

View File

@ -26,7 +26,7 @@ runArgParser = do opts <- execParser $ info parser
idrisProgDesc = PP.vsep [PP.empty, idrisProgDesc = PP.vsep [PP.empty,
PP.text "Idris is a general purpose pure functional programming language with dependent", PP.text "Idris is a general purpose pure functional programming language with dependent",
PP.text "types. Dependent types allow types to be predicated on values, meaning that", PP.text "types. Dependent types allow types to be predicated on values, meaning that",
PP.text "some aspects of a programs behaviour can be specified precisely in the type.", PP.text "some aspects of a program's behaviour can be specified precisely in the type.",
PP.text "It is compiled, with eager evaluation. Its features are influenced by Haskell", PP.text "It is compiled, with eager evaluation. Its features are influenced by Haskell",
PP.text "and ML.", PP.text "and ML.",
PP.empty, PP.empty,

View File

@ -17,21 +17,43 @@ desugar :: SyntaxInfo -> IState -> PTerm -> PTerm
desugar syn i t = let t' = expandDo (dsl_info syn) t in desugar syn i t = let t' = expandDo (dsl_info syn) t in
t' -- addImpl i t' t' -- addImpl i t'
mkTTName :: FC -> Name -> PTerm
mkTTName fc n =
let mkList fc [] = PRef fc (sNS (sUN "Nil") ["List", "Prelude"])
mkList fc (x:xs) = PApp fc (PRef fc (sNS (sUN "::") ["List", "Prelude"]))
[ pexp (stringC x)
, pexp (mkList fc xs)]
stringC = PConstant . Str . str
intC = PConstant . I
reflm n = sNS (sUN n) ["Reflection", "Language"]
in case n of
UN nm -> PApp fc (PRef fc (reflm "UN")) [ pexp (stringC nm)]
NS nm ns -> PApp fc (PRef fc (reflm "NS")) [ pexp (mkTTName fc nm)
, pexp (mkList fc ns)]
MN i nm -> PApp fc (PRef fc (reflm "MN")) [ pexp (intC i)
, pexp (stringC nm)]
otherwise -> PRef fc $ reflm "NErased"
expandDo :: DSL -> PTerm -> PTerm expandDo :: DSL -> PTerm -> PTerm
expandDo dsl (PLam fc n ty tm) expandDo dsl (PLam fc n ty tm)
| Just lam <- dsl_lambda dsl | Just lam <- dsl_lambda dsl
= let sc = PApp fc lam [pexp (var dsl n tm 0)] in = let sc = PApp fc lam [ pexp (mkTTName fc n)
expandDo dsl sc , pexp (var dsl n tm 0)]
in expandDo dsl sc
expandDo dsl (PLam fc n ty tm) = PLam fc n (expandDo dsl ty) (expandDo dsl tm) expandDo dsl (PLam fc n ty tm) = PLam fc n (expandDo dsl ty) (expandDo dsl tm)
expandDo dsl (PLet fc n ty v tm) expandDo dsl (PLet fc n ty v tm)
| Just letb <- dsl_let dsl | Just letb <- dsl_let dsl
= let sc = PApp (fileFC "(dsl)") letb [pexp v, pexp (var dsl n tm 0)] in = let sc = PApp (fileFC "(dsl)") letb [ pexp (mkTTName fc n)
expandDo dsl sc , pexp v
, pexp (var dsl n tm 0)]
in expandDo dsl sc
expandDo dsl (PLet fc n ty v tm) = PLet fc n (expandDo dsl ty) (expandDo dsl v) (expandDo dsl tm) expandDo dsl (PLet fc n ty v tm) = PLet fc n (expandDo dsl ty) (expandDo dsl v) (expandDo dsl tm)
expandDo dsl (PPi p n ty tm) expandDo dsl (PPi p n ty tm)
| Just pi <- dsl_pi dsl | Just pi <- dsl_pi dsl
= let sc = PApp (fileFC "(dsl)") pi [pexp ty, pexp (var dsl n tm 0)] in = let sc = PApp (fileFC "(dsl)") pi [ pexp (mkTTName (fileFC "(dsl)") n)
expandDo dsl sc , pexp ty
, pexp (var dsl n tm 0)]
in expandDo dsl sc
expandDo dsl (PPi p n ty tm) = PPi p n (expandDo dsl ty) (expandDo dsl tm) expandDo dsl (PPi p n ty tm) = PPi p n (expandDo dsl ty) (expandDo dsl tm)
expandDo dsl (PApp fc t args) = PApp fc (expandDo dsl t) expandDo dsl (PApp fc t args) = PApp fc (expandDo dsl t)
(map (fmap (expandDo dsl)) args) (map (fmap (expandDo dsl)) args)

View File

@ -648,9 +648,9 @@ elabClause info opts (cnum, PClause fc fname lhs_in_as withs rhs_in_as wherebloc
-- Now build the RHS, using the type of the LHS as the goal. -- Now build the RHS, using the type of the LHS as the goal.
i <- getIState -- new implicits from where block i <- getIState -- new implicits from where block
logLvl 5 (showTmImpls (expandParams decorate newargs defs (defs \\ decls) rhs_in)) logLvl 5 (showTmImpls (expandParams decorate newargs defs (defs \\ decls) rhs_in))
let rhs = addImplBoundInf i (map fst newargs) (defs \\ decls) let rhs = addImplBoundInf i (map fst newargs_all) (defs \\ decls)
(expandParams decorate newargs defs (defs \\ decls) rhs_in) (expandParams decorate newargs defs (defs \\ decls) rhs_in)
logLvl 2 $ "RHS: " ++ showTmImpls rhs logLvl 2 $ "RHS: " ++ show (map fst newargs_all) ++ " " ++ showTmImpls rhs
ctxt <- getContext -- new context with where block added ctxt <- getContext -- new context with where block added
logLvl 5 "STARTING CHECK" logLvl 5 "STARTING CHECK"
((rhs', defer, is, probs), _) <- ((rhs', defer, is, probs), _) <-
@ -673,7 +673,7 @@ elabClause info opts (cnum, PClause fc fname lhs_in_as withs rhs_in_as wherebloc
when inf $ addTyInfConstraints fc (map (\(x,y,_,_,_,_,_) -> (x,y)) probs) when inf $ addTyInfConstraints fc (map (\(x,y,_,_,_,_,_) -> (x,y)) probs)
logLvl 5 "DONE CHECK" logLvl 5 "DONE CHECK"
logLvl 2 $ "---> " ++ show rhs' logLvl 4 $ "---> " ++ show rhs'
when (not (null defer)) $ iLOG $ "DEFERRED " ++ when (not (null defer)) $ iLOG $ "DEFERRED " ++
show (map (\ (n, (_,_,t)) -> (n, t)) defer) show (map (\ (n, (_,_,t)) -> (n, t)) defer)
def' <- checkDef fc defer def' <- checkDef fc defer

View File

@ -316,11 +316,13 @@ elabCaseFun ind paramPos n ty cons info = do
eliminatorClauses <- mapM (\(cns, cnsElim) -> generateEliminatorClauses cns cnsElim clauseGeneralArgs generalParams) (zip cons clauseConsElimArgs) eliminatorClauses <- mapM (\(cns, cnsElim) -> generateEliminatorClauses cns cnsElim clauseGeneralArgs generalParams) (zip cons clauseConsElimArgs)
let eliminatorDef = PClauses emptyFC [TotalFn] elimDeclName eliminatorClauses let eliminatorDef = PClauses emptyFC [TotalFn] elimDeclName eliminatorClauses
elimLog $ "-- case function definition: " ++ (show . showDeclImp verbosePPOption) eliminatorDef elimLog $ "-- case function definition: " ++ (show . showDeclImp verbosePPOption) eliminatorDef
State.lift $ idrisCatch (rec_elabDecl info EAll info eliminatorTyDecl) (\err -> return ()) State.lift $ idrisCatch (rec_elabDecl info EAll info eliminatorTyDecl)
(ierror . Elaborating "type declaration of " elimDeclName)
-- Do not elaborate clauses if there aren't any -- Do not elaborate clauses if there aren't any
case eliminatorClauses of case eliminatorClauses of
[] -> State.lift $ solveDeferred elimDeclName -- Remove meta-variable for type [] -> State.lift $ solveDeferred elimDeclName -- Remove meta-variable for type
_ -> State.lift $ idrisCatch (rec_elabDecl info EAll info eliminatorDef) (\err -> return ()) _ -> State.lift $ idrisCatch (rec_elabDecl info EAll info eliminatorDef)
(ierror . Elaborating "clauses of " elimDeclName)
where elimLog :: String -> EliminatorState () where elimLog :: String -> EliminatorState ()
elimLog s = State.lift (logLvl 2 s) elimLog s = State.lift (logLvl 2 s)

View File

@ -893,9 +893,17 @@ elab ist info emode opts fn tm
-- Drop the unique arguments used in the term already -- Drop the unique arguments used in the term already
-- and in the scrutinee (since it's -- and in the scrutinee (since it's
-- not valid to use them again anyway) -- not valid to use them again anyway)
--
-- Also drop unique arguments which don't appear explicitly
-- in either case branch so they don't count as used
-- unnecessarily (can only do this for unique things, since we
-- assume they don't appear implicitly in types)
ptm <- get_term ptm <- get_term
let inOpts = (filter (/= scvn) (map fst args)) \\ (concatMap (\x -> allNamesIn (snd x)) opts)
let argsDropped = filter (isUnique envU) let argsDropped = filter (isUnique envU)
(nub $ allNamesIn scr ++ inApp ptm) (nub $ allNamesIn scr ++ inApp ptm ++
inOpts)
let args' = filter (\(n, _) -> n `notElem` argsDropped) args let args' = filter (\(n, _) -> n `notElem` argsDropped) args

View File

@ -105,30 +105,28 @@ isEol :: Char -> Bool
isEol '\n' = True isEol '\n' = True
isEol _ = False isEol _ = False
-- | A parser that succeeds at the end of the line
eol :: MonadicParsing m => m () eol :: MonadicParsing m => m ()
eol = (satisfy isEol *> pure ()) <|> lookAhead eof <?> "end of line" eol = (satisfy isEol *> pure ()) <|> lookAhead eof <?> "end of line"
{- | Consumes a single-line comment {- | Consumes a single-line comment
@ @
SingleLineComment_t ::= '--' EOL_t SingleLineComment_t ::= '--' ~EOL_t* EOL_t ;
| '--' ~DocCommentMarker_t ~EOL_t* EOL_t
;
@ @
-} -}
singleLineComment :: MonadicParsing m => m () singleLineComment :: MonadicParsing m => m ()
singleLineComment = try (string "--" *> eol *> pure ()) singleLineComment = (string "--" *>
<|> try (string "--" *> many simpleWhiteSpace *> many (satisfy (not . isEol)) *>
many (satisfy (not . isEol)) *> eol *> pure ())
eol *> pure ()) <?> "single-line comment"
<?> ""
{- | Consumes a multi-line comment {- | Consumes a multi-line comment
@ @
MultiLineComment_t ::= MultiLineComment_t ::=
'{ -- }' '{ -- }'
| '{ -' ~DocCommentMarker_t InCommentChars_t | '{ -' InCommentChars_t
; ;
@ @
@ -154,7 +152,7 @@ multiLineComment = try (string "{-" *> (string "-}") *> pure ())
startEnd :: String startEnd :: String
startEnd = "{}-" startEnd = "{}-"
{-| Parses a documentation comment (similar to haddock) given a marker character {-| Parses a documentation comment
@ @
DocComment_t ::= '|||' ~EOL_t* EOL_t DocComment_t ::= '|||' ~EOL_t* EOL_t

View File

@ -1311,8 +1311,24 @@ loadSource lidr f toline
mapM_ (addIBC . IBCImport) [(reexport, realName) | (reexport, realName, alias, fc) <- imports] mapM_ (addIBC . IBCImport) [(reexport, realName) | (reexport, realName, alias, fc) <- imports]
let syntax = defaultSyntax{ syn_namespace = reverse mname, let syntax = defaultSyntax{ syn_namespace = reverse mname,
maxline = toline } maxline = toline }
ist <- getIState
-- Save the span from parsing the module header, because
-- an empty program parse might obliterate it.
let oldSpan = idris_parsedSpan ist
ds' <- parseProg syntax f file pos ds' <- parseProg syntax f file pos
case (ds', oldSpan) of
([], Just fc) ->
-- If no program elements were parsed, we dind't
-- get a loaded region in the IBC file. That
-- means we need to add it back.
do ist <- getIState
putIState ist { idris_parsedSpan = oldSpan
, ibc_write = IBCParsedRegion fc :
ibc_write ist
}
_ -> return ()
-- Parsing done, now process declarations -- Parsing done, now process declarations
let ds = namespaces mname ds' let ds = namespaces mname ds'

View File

@ -821,7 +821,7 @@ process fn (Undefine names) = undefine names
-- Keep track of which names you've removed so you can -- Keep track of which names you've removed so you can
-- print them out to the user afterward -- print them out to the user afterward
undefine names = undefine' names [] undefine names = undefine' names []
undefine' [] list = do iRenderOutput $ printUndefinedNames list undefine' [] list = do iRenderResult $ printUndefinedNames list
return () return ()
undefine' (n:names) already = do undefine' (n:names) already = do
allDefined <- idris_repl_defs `fmap` get allDefined <- idris_repl_defs `fmap` get
@ -1104,10 +1104,12 @@ process fn Execute
(tmpn, tmph) <- runIO tempfile (tmpn, tmph) <- runIO tempfile
runIO $ hClose tmph runIO $ hClose tmph
t <- codegen t <- codegen
-- gcc adds .exe when it builds windows programs
progName <- return $ if isWindows then tmpn ++ ".exe" else tmpn
ir <- compile t tmpn m ir <- compile t tmpn m
runIO $ generate t (fst (head (idris_imported ist))) ir runIO $ generate t (fst (head (idris_imported ist))) ir
case idris_outputmode ist of case idris_outputmode ist of
RawOutput h -> do runIO $ rawSystem tmpn [] RawOutput h -> do runIO $ rawSystem progName []
return () return ()
IdeMode n h -> runIO . hPutStrLn h $ IdeMode n h -> runIO . hPutStrLn h $
IdeMode.convSExp "run-program" tmpn n) IdeMode.convSExp "run-program" tmpn n)

View File

@ -16,7 +16,7 @@ import Idris.CmdOptions
import Control.Monad.State.Strict import Control.Monad.State.Strict
import Control.Applicative import Control.Applicative
import System.Info (os) import Util.System
type PParser = StateT PkgDesc IdrisInnerParser type PParser = StateT PkgDesc IdrisInnerParser
@ -63,7 +63,7 @@ pClause :: PParser ()
pClause = do reserved "executable"; lchar '='; pClause = do reserved "executable"; lchar '=';
exec <- iName [] exec <- iName []
st <- get st <- get
put (st { execout = Just (if os `elem` ["win32", "mingw32", "cygwin32"] put (st { execout = Just (if isWindows
then ((show exec) ++ ".exe") then ((show exec) ++ ".exe")
else ( show exec ) else ( show exec )
) }) ) })

View File

@ -1,4 +1,4 @@
module Util.System(tempfile,withTempdir,rmFile,catchIO) where module Util.System(tempfile,withTempdir,rmFile,catchIO, isWindows) where
-- System helper functions. -- System helper functions.
import Control.Monad (when) import Control.Monad (when)
@ -9,6 +9,7 @@ import System.Directory (getTemporaryDirectory
) )
import System.FilePath ((</>), normalise) import System.FilePath ((</>), normalise)
import System.IO import System.IO
import System.Info
import System.IO.Error import System.IO.Error
import Control.Exception as CE import Control.Exception as CE
@ -18,6 +19,9 @@ catchIO = CE.catch
throwIO :: IOError -> IO a throwIO :: IOError -> IO a
throwIO = CE.throw throwIO = CE.throw
isWindows :: Bool
isWindows = os `elem` ["win32", "mingw32", "cygwin32"]
tempfile :: IO (FilePath, Handle) tempfile :: IO (FilePath, Handle)
tempfile = do dir <- getTemporaryDirectory tempfile = do dir <- getTemporaryDirectory
openTempFile (normalise dir) "idris" openTempFile (normalise dir) "idris"

View File

@ -35,8 +35,11 @@ using (G : Vect n Ty)
If : Expr G TyBool -> Expr G a -> Expr G a -> Expr G a If : Expr G TyBool -> Expr G a -> Expr G a -> Expr G a
Bind : Expr G a -> (interpTy a -> Expr G b) -> Expr G b Bind : Expr G a -> (interpTy a -> Expr G b) -> Expr G b
lam_ : TTName -> Expr (a :: G) t -> Expr G (TyFun a t)
lam_ _ = Lam
dsl expr dsl expr
lambda = Lam lambda = lam_
variable = Var variable = Var
index_first = stop index_first = stop
index_next = pop index_next = pop

View File

@ -156,6 +156,11 @@ using (i: Fin n, gam : Vect n Ty, gam' : Vect n Ty, gam'' : Vect n Ty)
= interp env v (\env', v' => do n <- v' = interp env v (\env', v' => do n <- v'
interp env' (f n) k) interp env' (f n) k)
let_ : _ -> Creator (interpTy a) ->
Res (a :: gam) (Val () :: gam') (R t) ->
Res gam gam' (R t)
let_ _ = Let
-- run : {static} Res [] [] (R t) -> IO t -- run : {static} Res [] [] (R t) -> IO t
-- run prog = interp [] prog (\env, res => res) -- run prog = interp [] prog (\env, res => res)
@ -163,7 +168,7 @@ syntax run [prog] = interp [] prog (\env, res => res)
dsl res dsl res
variable = id variable = id
let = Let let = let_
index_first = stop index_first = stop
index_next = pop index_next = pop

View File

@ -5,8 +5,11 @@ import Data.Vect
data Ty = BOOL | INT | UNIT | ARR Ty Ty data Ty = BOOL | INT | UNIT | ARR Ty Ty
arr_ : _ -> Ty -> Ty -> Ty
arr_ _ = ARR
dsl simple_type dsl simple_type
pi = ARR pi = arr_
test1 : simple_type (BOOL -> INT -> UNIT) = BOOL `ARR` (INT `ARR` UNIT) test1 : simple_type (BOOL -> INT -> UNIT) = BOOL `ARR` (INT `ARR` UNIT)
test1 = Refl test1 = Refl
@ -25,8 +28,11 @@ using (vars : Vect n Ty)
implicit exprSpec : Expr vars BOOL -> Spec vars implicit exprSpec : Expr vars BOOL -> Spec vars
exprSpec = ItHolds exprSpec = ItHolds
forall_ : _ -> (t : Ty) -> Spec (t :: vars) -> Spec vars
forall_ _ = ForAll
dsl specs dsl specs
pi = ForAll pi = forall_
variable = Var variable = Var
index_first = FZ index_first = FZ
index_next = FS index_next = FS

View File

@ -14,7 +14,7 @@ instance Functor IntFn where -- (\x => Int -> x) where
instance Applicative (\x => Int -> x) where instance Applicative (\x => Int -> x) where
pure v = \x => v pure v = \x => v
(<$>) f a = \x => f x (a x) (<*>) f a = \x => f x (a x)
instance Monad IntFn where instance Monad IntFn where
f >>= k = \x => k (f x) x f >>= k = \x => k (f x) x

View File

@ -12,17 +12,18 @@ When elaborating an application of function Prelude.Monad.>>=:
\{uv0} => argTy -> uv \{uv0} => argTy -> uv
./baddoublebang.idr:6:26: error: not ./baddoublebang.idr:6:26: error: not
a terminator, expected: "$", a terminator, expected: "$",
"$>", "&&", "*", "+", "++", "-", "&&", "*", "*>", "+", "++", "-",
"->", ".", "/", "/=", "::", ";", "->", ".", "/", "/=", "::", ";",
"<", "<#>", "<$", "<$>", "<*>", "<", "<#>", "<$>", "<*", "<*>",
"<+>", "<->", "<<", "<=", "<|>", "<+>", "<->", "<.>", "<<", "<=",
"=", "==", ">", ">=", ">>", "<|>", "=", "==", ">", ">=",
">>=", "\\\\", "`", "in", "||", ">>", ">>=", "\\\\", "`", "in",
"~=~", "||", "~=~",
ambiguous use of a left-associative operator, ambiguous use of a left-associative operator,
ambiguous use of a non-associative operator, ambiguous use of a non-associative operator,
ambiguous use of a right-associative operator, ambiguous use of a right-associative operator,
end of input, function argument, end of input, function argument,
matching application expression matching application expression,
single-line comment
doubleBang mmn = do pure !!mmn doubleBang mmn = do pure !!mmn
^ ^

View File

@ -5,5 +5,5 @@ data FourFunctor y = Four y y y y
traverseFourFunctor : Applicative f -> traverseFourFunctor : Applicative f ->
(x -> f b) -> FourFunctor x -> f (FourFunctor b) (x -> f b) -> FourFunctor x -> f (FourFunctor b)
traverseFourFunctor constr f (Four w x y z) traverseFourFunctor constr f (Four w x y z)
= pure Four <$> (f w) <$> (f x) <$> (f y) <$> (f z) = pure Four <*> (f w) <*> (f x) <*> (f y) <*> (f z)

View File

@ -54,6 +54,8 @@ using (ctxt : Vect n Ty)
run (App f x) env = !(run f env) !(run x env) run (App f x) env = !(run f env) !(run x env)
run (Die {loc}) _ = Left loc run (Die {loc}) _ = Left loc
lam_ : _ -> Tm (t::ctxt) t' -> Tm ctxt (Arr t t')
lam_ _ = Lam
exec : Tm [] t -> IO () exec : Tm [] t -> IO ()
exec tm = case run tm [] of exec tm = case run tm [] of
@ -64,7 +66,7 @@ dsl lang
variable = Var variable = Var
index_first = FZ index_first = FZ
index_next = FS index_next = FS
lambda = Lam lambda = lam_
testTerm1 : Tm [] (Arr U U) testTerm1 : Tm [] (Arr U U)
testTerm1 = lang (\x=>Die) testTerm1 = lang (\x=>Die)

View File

@ -3,9 +3,9 @@ FileLoc "SourceLoc.idr" (16, 11) (16, 11)
Testing using inline tactics Testing using inline tactics
FileLoc "SourceLoc.idr" (20, 17) (20, 17) FileLoc "SourceLoc.idr" (20, 17) (20, 17)
Testing using metavariable with later definition Testing using metavariable with later definition
FileLoc "SourceLoc.idr" (96, 16) (96, 16) FileLoc "SourceLoc.idr" (98, 16) (98, 16)
----------------------- -----------------------
Success! Success!
Error at FileLoc "SourceLoc.idr" (70, 23) (70, 23) Error at FileLoc "SourceLoc.idr" (72, 23) (72, 23)
Success! Success!
Success! Success!

View File

@ -19,7 +19,7 @@ instance Functor Eval where
instance Applicative Eval where instance Applicative Eval where
pure x = MkEval (\e => Just x) pure x = MkEval (\e => Just x)
(<$>) (MkEval f) (MkEval g) = MkEval (\x => appAux (f x) (g x)) where (<*>) (MkEval f) (MkEval g) = MkEval (\x => appAux (f x) (g x)) where
appAux : Maybe (a -> b) -> Maybe a -> Maybe b appAux : Maybe (a -> b) -> Maybe a -> Maybe b
appAux (Just fx) (Just gx) = Just (fx gx) appAux (Just fx) (Just gx) = Just (fx gx)
appAux _ _ = Nothing appAux _ _ = Nothing

View File

@ -19,7 +19,7 @@ instance Functor Eval where
instance Applicative Eval where instance Applicative Eval where
pure x = MkEval (\e => Just x) pure x = MkEval (\e => Just x)
(<$>) (MkEval f) (MkEval g) = MkEval (\x => app (f x) (g x)) where (<*>) (MkEval f) (MkEval g) = MkEval (\x => app (f x) (g x)) where
app : Maybe (a -> b) -> Maybe a -> Maybe b app : Maybe (a -> b) -> Maybe a -> Maybe b
app (Just fx) (Just gx) = Just (fx gx) app (Just fx) (Just gx) = Just (fx gx)
app _ _ = Nothing app _ _ = Nothing