hacking around and maybe I can make state suck less?
This commit is contained in:
commit
f4b52f0958
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
.stack-work/
|
||||
*~
|
9
app/Main.hs
Normal file
9
app/Main.hs
Normal file
@ -0,0 +1,9 @@
|
||||
module Main where
|
||||
|
||||
import TuringHS
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- readFile "helloworld.txt"
|
||||
putStrLn "Running the program!"
|
||||
interpret (compile input)
|
35
helloworld.txt
Normal file
35
helloworld.txt
Normal file
@ -0,0 +1,35 @@
|
||||
This program prints "Hello World!" and a newline to the screen, its
|
||||
length is 106 active command characters (it is not the shortest)
|
||||
++++++++ Set Cell #0 to 8
|
||||
[
|
||||
>++++ Add 4 to Cell #1; this will always set Cell #1 to 4
|
||||
[ as the cell will be cleared by the loop
|
||||
>++ Add 2 to Cell #2
|
||||
>+++ Add 3 to Cell #3
|
||||
>+++ Add 3 to Cell #4
|
||||
>+ Add 1 to Cell #5
|
||||
<<<<- Decrement the loop counter in Cell #1
|
||||
] Loop until Cell #1 is zero; number of iterations is 4
|
||||
>+ Add 1 to Cell #2
|
||||
>+ Add 1 to Cell #3
|
||||
>- Subtract 1 from Cell #4
|
||||
>>+ Add 1 to Cell #6
|
||||
[<] Move back to the first zero cell you find; this will
|
||||
be Cell #1 which was cleared by the previous loop
|
||||
<- Decrement the loop Counter in Cell #0
|
||||
] Loop until Cell #0 is zero; number of iterations is 8
|
||||
|
||||
The result of this is:
|
||||
Cell no : 0 1 2 3 4 5 6
|
||||
Contents: 0 0 72 104 88 32 8
|
||||
Pointer : ^
|
||||
|
||||
>>. Cell #2 has value 72 which is 'H'
|
||||
>---. Subtract 3 from Cell #3 to get 101 which is 'e'
|
||||
+++++++..+++. Likewise for 'llo' from Cell #3
|
||||
>>. Cell #5 is 32 for the space
|
||||
<-. Subtract 1 from Cell #4 for 87 to give a 'W'
|
||||
<. Cell #3 was set to 'o' from the end of 'Hello'
|
||||
+++.------.--------. Cell #3 for 'rl' and 'd'
|
||||
>>+. Add 1 to Cell #5 gives us an exclamation point
|
||||
>++. And finally a newline from Cell #6
|
10
hie.yaml
Normal file
10
hie.yaml
Normal file
@ -0,0 +1,10 @@
|
||||
cradle:
|
||||
stack:
|
||||
- path: "./src"
|
||||
component: "turing-hs:lib"
|
||||
|
||||
- path: "./app/Main.hs"
|
||||
component: "turing-hs:exe:turing"
|
||||
|
||||
- path: "./test"
|
||||
component: "turing-hs:test:turing-hs-test"
|
91
package.yaml
Normal file
91
package.yaml
Normal file
@ -0,0 +1,91 @@
|
||||
name: turing-hs
|
||||
version: 0.1.0.0
|
||||
|
||||
extra-source-files:
|
||||
- README.md
|
||||
|
||||
dependencies:
|
||||
- base >= 4.7 && < 5
|
||||
|
||||
library:
|
||||
source-dirs: src
|
||||
|
||||
executables:
|
||||
turing:
|
||||
main: Main.hs
|
||||
source-dirs: app
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- turing-hs
|
||||
|
||||
tests:
|
||||
turing-hs-test:
|
||||
main: Spec.hs
|
||||
source-dirs: test
|
||||
ghc-options:
|
||||
- -threaded
|
||||
- -rtsopts
|
||||
- -with-rtsopts=-N
|
||||
dependencies:
|
||||
- turing-hs
|
||||
|
||||
ghc-options:
|
||||
- -Wall
|
||||
- -Werror
|
||||
- -Wcompat
|
||||
- -Widentities
|
||||
- -Wincomplete-patterns
|
||||
- -Wincomplete-record-updates
|
||||
- -Wincomplete-uni-patterns
|
||||
- -Wmissing-deriving-strategies
|
||||
- -Wmissing-home-modules
|
||||
- -Wname-shadowing
|
||||
- -Wpartial-fields
|
||||
- -Wredundant-constraints
|
||||
- -Wunused-packages
|
||||
- -Wunused-type-patterns
|
||||
|
||||
default-extensions:
|
||||
- BangPatterns
|
||||
- BinaryLiterals
|
||||
- BlockArguments
|
||||
- ConstraintKinds
|
||||
- DataKinds
|
||||
- DefaultSignatures
|
||||
- DeriveDataTypeable
|
||||
- DeriveFoldable
|
||||
- DeriveFunctor
|
||||
- DeriveGeneric
|
||||
- DeriveTraversable
|
||||
- DerivingStrategies
|
||||
- DoAndIfThenElse
|
||||
- EmptyDataDecls
|
||||
- ExistentialQuantification
|
||||
- FlexibleContexts
|
||||
- FlexibleInstances
|
||||
- FunctionalDependencies
|
||||
- GADTs
|
||||
- GeneralizedNewtypeDeriving
|
||||
- InstanceSigs
|
||||
- KindSignatures
|
||||
- LambdaCase
|
||||
- MultiParamTypeClasses
|
||||
- MultiWayIf
|
||||
- NamedFieldPuns
|
||||
- OverloadedStrings
|
||||
- PartialTypeSignatures
|
||||
- PatternGuards
|
||||
- PatternSynonyms
|
||||
- PolyKinds
|
||||
- RankNTypes
|
||||
- RecordWildCards
|
||||
- ScopedTypeVariables
|
||||
- StandaloneDeriving
|
||||
- TemplateHaskell
|
||||
- TupleSections
|
||||
- TypeFamilies
|
||||
- TypeSynonymInstances
|
||||
- ViewPatterns
|
10
src/TuringHS.hs
Normal file
10
src/TuringHS.hs
Normal file
@ -0,0 +1,10 @@
|
||||
module TuringHS
|
||||
( module TuringHS.Compiler,
|
||||
module TuringHS.Operation,
|
||||
module TuringHS.Interpreter,
|
||||
)
|
||||
where
|
||||
|
||||
import TuringHS.Compiler
|
||||
import TuringHS.Interpreter
|
||||
import TuringHS.Operation
|
18
src/TuringHS/Compiler.hs
Normal file
18
src/TuringHS/Compiler.hs
Normal file
@ -0,0 +1,18 @@
|
||||
module TuringHS.Compiler where
|
||||
|
||||
import TuringHS.Operation
|
||||
|
||||
compile :: String -> [Operation]
|
||||
compile = go []
|
||||
where
|
||||
go ops (c : cs) = case c of
|
||||
'<' -> go (Backward : ops) cs
|
||||
'>' -> go (Forward : ops) cs
|
||||
'+' -> go (Increment : ops) cs
|
||||
'-' -> go (Decrement : ops) cs
|
||||
'.' -> go (Put : ops) cs
|
||||
',' -> go (Get : ops) cs
|
||||
'[' -> go (JumpForward : ops) cs
|
||||
']' -> go (JumpBackward : ops) cs
|
||||
_ -> go ops cs
|
||||
go ops [] = reverse ops
|
210
src/TuringHS/Interpreter.hs
Normal file
210
src/TuringHS/Interpreter.hs
Normal file
@ -0,0 +1,210 @@
|
||||
{-# LANGUAGE TupleSections #-}
|
||||
|
||||
module TuringHS.Interpreter where
|
||||
|
||||
import Control.Monad
|
||||
import TuringHS.Operation
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Wrapping increment/decrement
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
increment :: (Eq n, Bounded n, Enum n) => n -> n
|
||||
increment x
|
||||
| x == maxBound = minBound
|
||||
| otherwise = succ x
|
||||
|
||||
decrement :: (Eq n, Bounded n, Enum n) => n -> n
|
||||
decrement x
|
||||
| x == minBound = maxBound
|
||||
| otherwise = pred x
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- State Monad
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
newtype State s m a = State {runState :: s -> m (a, s)}
|
||||
|
||||
state :: (s -> m (a, s)) -> State s m a
|
||||
state = State
|
||||
|
||||
get :: (Monad m) => State s m s
|
||||
get = State \s -> return (s, s)
|
||||
|
||||
put :: (Monad m) => s -> State s m ()
|
||||
put s = State \_ -> return ((), s)
|
||||
|
||||
instance (Monad m) => Functor (State s m) where
|
||||
fmap f (State g) = State \s0 -> do
|
||||
(x1, s1) <- g s0
|
||||
return (f x1, s1)
|
||||
|
||||
instance (Monad m) => Applicative (State s m) where
|
||||
pure x = State \s -> pure (x, s)
|
||||
State f <*> State g = State \s0 -> do
|
||||
(f1, s1) <- f s0
|
||||
(x2, s2) <- g s1
|
||||
return (f1 x2, s2)
|
||||
|
||||
instance (Monad m) => Monad (State s m) where
|
||||
State h >>= f = State \s0 -> do
|
||||
(x1, s1) <- h s0
|
||||
let State g = f x1
|
||||
g s1
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Tape Deck
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
data TapeDeck a = TapeDeck [a] [a]
|
||||
|
||||
tapeHead :: TapeDeck a -> a
|
||||
tapeHead = \case
|
||||
TapeDeck (x : _) _ -> x
|
||||
_ -> error "Empty tape!"
|
||||
|
||||
headOption :: TapeDeck a -> Maybe a
|
||||
headOption = \case
|
||||
TapeDeck (x : _) _ -> Just x
|
||||
_ -> Nothing
|
||||
|
||||
withHead :: (a -> a) -> TapeDeck a -> TapeDeck a
|
||||
withHead f = \case
|
||||
TapeDeck (x : front) back -> TapeDeck (f x : front) back
|
||||
x -> x
|
||||
|
||||
forwardExtend :: (Bounded a) => TapeDeck a -> TapeDeck a
|
||||
forwardExtend = \case
|
||||
TapeDeck (x : front) back -> TapeDeck front (x : back)
|
||||
TapeDeck [] back -> TapeDeck [minBound] back
|
||||
|
||||
backwardExtend :: (Bounded a) => TapeDeck a -> TapeDeck a
|
||||
backwardExtend = \case
|
||||
TapeDeck front (x : back) -> TapeDeck (x : front) back
|
||||
TapeDeck front [] -> TapeDeck (minBound : front) []
|
||||
|
||||
forward :: TapeDeck a -> TapeDeck a
|
||||
forward = \case
|
||||
TapeDeck (x : front) back -> TapeDeck front (x : back)
|
||||
_ -> error "Read past the end of the tape!"
|
||||
|
||||
backward :: TapeDeck a -> TapeDeck a
|
||||
backward = \case
|
||||
TapeDeck front (x : back) -> TapeDeck (x : front) back
|
||||
_ -> error "Read past the start of the tape!"
|
||||
|
||||
endOfTape :: TapeDeck a -> Bool
|
||||
endOfTape = \case
|
||||
TapeDeck (_ : _) _ -> False
|
||||
_ -> True
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Turing Machine
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
class (Monad m) => TuringEffect m n where
|
||||
readData :: m n
|
||||
storeData :: n -> m ()
|
||||
buffer :: m [n]
|
||||
|
||||
data TuringMachine a = TuringMachine
|
||||
{ turingOps :: TapeDeck Operation,
|
||||
turingTape :: TapeDeck a,
|
||||
turingLoop :: Int
|
||||
}
|
||||
|
||||
runMachine :: forall m n. (TuringEffect m n, Eq n, Enum n, Bounded n) => [Operation] -> m [n]
|
||||
runMachine ops = runState step machine >> buffer
|
||||
where
|
||||
machine :: TuringMachine n
|
||||
machine =
|
||||
TuringMachine
|
||||
{ turingOps = TapeDeck ops [],
|
||||
turingTape = TapeDeck [minBound] [],
|
||||
turingLoop = 0
|
||||
}
|
||||
|
||||
step :: (TuringEffect m n, Eq n, Enum n, Bounded n) => State (TuringMachine n) m ()
|
||||
step = tryRunOp . turingOps =<< get
|
||||
where
|
||||
tryRunOp ops
|
||||
| endOfTape ops = return ()
|
||||
| otherwise = runOp (tapeHead ops) >> step
|
||||
runOp = \case
|
||||
Forward -> forwardOp
|
||||
Backward -> backwardOp
|
||||
Increment -> incrementOp
|
||||
Decrement -> decrementOp
|
||||
Put -> putOp
|
||||
Get -> getOp
|
||||
JumpForward -> jumpForwardOp
|
||||
JumpBackward -> jumpBackwardOp
|
||||
|
||||
nextOperation :: (Monad m) => State (TuringMachine n) m (Maybe Operation)
|
||||
nextOperation = do
|
||||
ops <- turingOps <$> get
|
||||
return
|
||||
if endOfTape ops
|
||||
then Nothing
|
||||
else Just $ tapeHead ops
|
||||
|
||||
forwardOp :: (Bounded n, Monad m) => State (TuringMachine n) m ()
|
||||
forwardOp = withTape forwardExtend
|
||||
|
||||
backwardOp :: (Bounded n, Monad m) => State (TuringMachine n) m ()
|
||||
backwardOp = withTape backwardExtend
|
||||
|
||||
withTape :: (Monad m) => (TapeDeck n -> TapeDeck n) -> State (TuringMachine n) m ()
|
||||
withTape f = do
|
||||
machine <- get
|
||||
let turingTape' = f $ turingTape machine
|
||||
put $ machine {turingTape = turingTape'}
|
||||
|
||||
incrementOp :: (Monad m, Eq n, Enum n, Bounded n) => State (TuringMachine n) m ()
|
||||
incrementOp = withTapeHead increment
|
||||
|
||||
decrementOp :: (Monad m, Eq n, Enum n, Bounded n) => State (TuringMachine n) m ()
|
||||
decrementOp = withTapeHead decrement
|
||||
|
||||
withTapeHead :: (Monad m) => (n -> n) -> State (TuringMachine n) m ()
|
||||
withTapeHead f = do
|
||||
machine <- get
|
||||
let turingTape' = withHead f (turingTape machine)
|
||||
put $ machine {turingTape = turingTape'}
|
||||
|
||||
putOp :: State (TuringMachine n) m ()
|
||||
putOp = undefined
|
||||
|
||||
getOp :: State (TuringMachine n) m ()
|
||||
getOp = undefined
|
||||
|
||||
jumpForwardOp :: (Monad m, Eq n, Bounded n) => State (TuringMachine n) m ()
|
||||
jumpForwardOp = do
|
||||
withLoop succ
|
||||
x <- readHead
|
||||
when (x /= minBound) undefined -- skip to next matching jump backward op
|
||||
|
||||
jumpBackwardOp :: (Monad m, Eq n, Bounded n) => State (TuringMachine n) m ()
|
||||
jumpBackwardOp = do
|
||||
withLoop pred
|
||||
x <- readHead
|
||||
when (x /= minBound) undefined -- skip back to the previous matching jump backward op
|
||||
|
||||
readHead :: (Monad m) => State (TuringMachine n) m n
|
||||
readHead = tapeHead . turingTape <$> get
|
||||
|
||||
getLoopLevel :: (Monad m) => State (TuringMachine n) m Int
|
||||
getLoopLevel = turingLoop <$> get
|
||||
|
||||
withLoop :: (Monad m) => (Int -> Int) -> State (TuringMachine n) m ()
|
||||
withLoop f = do
|
||||
machine <- get
|
||||
let loop = turingLoop machine
|
||||
put $ machine {turingLoop = f loop}
|
||||
return ()
|
||||
|
||||
withOps :: (Monad m) => (TapeDeck Operation -> TapeDeck Operation) -> State (TuringMachine n) m ()
|
||||
withOps f = do
|
||||
machine <- get
|
||||
let turingOps' = f $ turingOps machine
|
||||
put $ machine {turingOps = turingOps'}
|
25
src/TuringHS/Operation.hs
Normal file
25
src/TuringHS/Operation.hs
Normal file
@ -0,0 +1,25 @@
|
||||
module TuringHS.Operation where
|
||||
|
||||
data Operation
|
||||
= -- | ">" Increment the data pointer (to point to the next cell to the right).
|
||||
Forward
|
||||
| -- | "<" Decrement the data pointer (to point to the next cell to the left).
|
||||
Backward
|
||||
| -- | "+" Increment (increase by one) the byte at the data pointer.
|
||||
Increment
|
||||
| -- | "-" Decrement (decrease by one) the byte at the data pointer.
|
||||
Decrement
|
||||
| -- | "." Output the byte at the data pointer.
|
||||
Put
|
||||
| -- | "," Accept one byte of input, storing its value in the byte at the data
|
||||
-- pointer.
|
||||
Get
|
||||
| -- | "[" If the byte at the data pointer is zero, then instead of moving the
|
||||
-- instruction pointer forward to the next command, jump it forward to the
|
||||
-- command after the matching ] command.
|
||||
JumpForward
|
||||
| -- | "]" If the byte at the data pointer is nonzero, then instead of moving
|
||||
-- the instruction pointer forward to the next command, jump it back to the
|
||||
-- command after the matching [ command.
|
||||
JumpBackward
|
||||
deriving stock (Eq, Show)
|
67
stack.yaml
Normal file
67
stack.yaml
Normal file
@ -0,0 +1,67 @@
|
||||
# This file was automatically generated by 'stack init'
|
||||
#
|
||||
# Some commonly used options have been documented as comments in this file.
|
||||
# For advanced use and comprehensive documentation of the format, please see:
|
||||
# https://docs.haskellstack.org/en/stable/yaml_configuration/
|
||||
|
||||
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
|
||||
# A snapshot resolver dictates the compiler version and the set of packages
|
||||
# to be used for project dependencies. For example:
|
||||
#
|
||||
# resolver: lts-3.5
|
||||
# resolver: nightly-2015-09-21
|
||||
# resolver: ghc-7.10.2
|
||||
#
|
||||
# The location of a snapshot can be provided as a file or url. Stack assumes
|
||||
# a snapshot provided as a file might change, whereas a url resource does not.
|
||||
#
|
||||
# resolver: ./custom-snapshot.yaml
|
||||
# resolver: https://example.com/snapshots/2018-01-01.yaml
|
||||
resolver:
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/5.yaml
|
||||
|
||||
# User packages to be built.
|
||||
# Various formats can be used as shown in the example below.
|
||||
#
|
||||
# packages:
|
||||
# - some-directory
|
||||
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
|
||||
# subdirs:
|
||||
# - auto-update
|
||||
# - wai
|
||||
packages:
|
||||
- .
|
||||
# Dependency packages to be pulled from upstream that are not in the resolver.
|
||||
# These entries can reference officially published versions as well as
|
||||
# forks / in-progress versions pinned to a git hash. For example:
|
||||
#
|
||||
# extra-deps:
|
||||
# - acme-missiles-0.3
|
||||
# - git: https://github.com/commercialhaskell/stack.git
|
||||
# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
|
||||
#
|
||||
# extra-deps: []
|
||||
|
||||
# Override default flag values for local packages and extra-deps
|
||||
# flags: {}
|
||||
|
||||
# Extra package databases containing global packages
|
||||
# extra-package-dbs: []
|
||||
|
||||
# Control whether we use the GHC we find on the path
|
||||
# system-ghc: true
|
||||
#
|
||||
# Require a specific version of stack, using version ranges
|
||||
# require-stack-version: -any # Default
|
||||
# require-stack-version: ">=2.7"
|
||||
#
|
||||
# Override the architecture used by stack, especially useful on Windows
|
||||
# arch: i386
|
||||
# arch: x86_64
|
||||
#
|
||||
# Extra directories used by stack for building
|
||||
# extra-include-dirs: [/path/to/dir]
|
||||
# extra-lib-dirs: [/path/to/dir]
|
||||
#
|
||||
# Allow a newer minor version of GHC than the snapshot specifies
|
||||
# compiler-check: newer-minor
|
13
stack.yaml.lock
Normal file
13
stack.yaml.lock
Normal file
@ -0,0 +1,13 @@
|
||||
# This file was autogenerated by Stack.
|
||||
# You should not edit this file by hand.
|
||||
# For more information, please see the documentation at:
|
||||
# https://docs.haskellstack.org/en/stable/lock_files
|
||||
|
||||
packages: []
|
||||
snapshots:
|
||||
- completed:
|
||||
size: 585817
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/5.yaml
|
||||
sha256: 22d24d0dacad9c1450b9a174c28d203f9bb482a2a8da9710a2f2a9f4afee2887
|
||||
original:
|
||||
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/5.yaml
|
1
test/Spec.hs
Normal file
1
test/Spec.hs
Normal file
@ -0,0 +1 @@
|
||||
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
|
174
turing-hs.cabal
Normal file
174
turing-hs.cabal
Normal file
@ -0,0 +1,174 @@
|
||||
cabal-version: 1.12
|
||||
|
||||
-- This file has been generated from package.yaml by hpack version 0.34.4.
|
||||
--
|
||||
-- see: https://github.com/sol/hpack
|
||||
|
||||
name: turing-hs
|
||||
version: 0.1.0.0
|
||||
build-type: Simple
|
||||
extra-source-files:
|
||||
README.md
|
||||
|
||||
library
|
||||
exposed-modules:
|
||||
TuringHS
|
||||
TuringHS.Compiler
|
||||
TuringHS.Interpreter
|
||||
TuringHS.Operation
|
||||
other-modules:
|
||||
Paths_turing_hs
|
||||
hs-source-dirs:
|
||||
src
|
||||
default-extensions:
|
||||
BangPatterns
|
||||
BinaryLiterals
|
||||
BlockArguments
|
||||
ConstraintKinds
|
||||
DataKinds
|
||||
DefaultSignatures
|
||||
DeriveDataTypeable
|
||||
DeriveFoldable
|
||||
DeriveFunctor
|
||||
DeriveGeneric
|
||||
DeriveTraversable
|
||||
DerivingStrategies
|
||||
DoAndIfThenElse
|
||||
EmptyDataDecls
|
||||
ExistentialQuantification
|
||||
FlexibleContexts
|
||||
FlexibleInstances
|
||||
FunctionalDependencies
|
||||
GADTs
|
||||
GeneralizedNewtypeDeriving
|
||||
InstanceSigs
|
||||
KindSignatures
|
||||
LambdaCase
|
||||
MultiParamTypeClasses
|
||||
MultiWayIf
|
||||
NamedFieldPuns
|
||||
OverloadedStrings
|
||||
PartialTypeSignatures
|
||||
PatternGuards
|
||||
PatternSynonyms
|
||||
PolyKinds
|
||||
RankNTypes
|
||||
RecordWildCards
|
||||
ScopedTypeVariables
|
||||
StandaloneDeriving
|
||||
TemplateHaskell
|
||||
TupleSections
|
||||
TypeFamilies
|
||||
TypeSynonymInstances
|
||||
ViewPatterns
|
||||
ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-patterns -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wmissing-home-modules -Wname-shadowing -Wpartial-fields -Wredundant-constraints -Wunused-packages -Wunused-type-patterns
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
default-language: Haskell2010
|
||||
|
||||
executable turing
|
||||
main-is: Main.hs
|
||||
other-modules:
|
||||
Paths_turing_hs
|
||||
hs-source-dirs:
|
||||
app
|
||||
default-extensions:
|
||||
BangPatterns
|
||||
BinaryLiterals
|
||||
BlockArguments
|
||||
ConstraintKinds
|
||||
DataKinds
|
||||
DefaultSignatures
|
||||
DeriveDataTypeable
|
||||
DeriveFoldable
|
||||
DeriveFunctor
|
||||
DeriveGeneric
|
||||
DeriveTraversable
|
||||
DerivingStrategies
|
||||
DoAndIfThenElse
|
||||
EmptyDataDecls
|
||||
ExistentialQuantification
|
||||
FlexibleContexts
|
||||
FlexibleInstances
|
||||
FunctionalDependencies
|
||||
GADTs
|
||||
GeneralizedNewtypeDeriving
|
||||
InstanceSigs
|
||||
KindSignatures
|
||||
LambdaCase
|
||||
MultiParamTypeClasses
|
||||
MultiWayIf
|
||||
NamedFieldPuns
|
||||
OverloadedStrings
|
||||
PartialTypeSignatures
|
||||
PatternGuards
|
||||
PatternSynonyms
|
||||
PolyKinds
|
||||
RankNTypes
|
||||
RecordWildCards
|
||||
ScopedTypeVariables
|
||||
StandaloneDeriving
|
||||
TemplateHaskell
|
||||
TupleSections
|
||||
TypeFamilies
|
||||
TypeSynonymInstances
|
||||
ViewPatterns
|
||||
ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-patterns -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wmissing-home-modules -Wname-shadowing -Wpartial-fields -Wredundant-constraints -Wunused-packages -Wunused-type-patterns -threaded -rtsopts -with-rtsopts=-N
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, turing-hs
|
||||
default-language: Haskell2010
|
||||
|
||||
test-suite turing-hs-test
|
||||
type: exitcode-stdio-1.0
|
||||
main-is: Spec.hs
|
||||
other-modules:
|
||||
Paths_turing_hs
|
||||
hs-source-dirs:
|
||||
test
|
||||
default-extensions:
|
||||
BangPatterns
|
||||
BinaryLiterals
|
||||
BlockArguments
|
||||
ConstraintKinds
|
||||
DataKinds
|
||||
DefaultSignatures
|
||||
DeriveDataTypeable
|
||||
DeriveFoldable
|
||||
DeriveFunctor
|
||||
DeriveGeneric
|
||||
DeriveTraversable
|
||||
DerivingStrategies
|
||||
DoAndIfThenElse
|
||||
EmptyDataDecls
|
||||
ExistentialQuantification
|
||||
FlexibleContexts
|
||||
FlexibleInstances
|
||||
FunctionalDependencies
|
||||
GADTs
|
||||
GeneralizedNewtypeDeriving
|
||||
InstanceSigs
|
||||
KindSignatures
|
||||
LambdaCase
|
||||
MultiParamTypeClasses
|
||||
MultiWayIf
|
||||
NamedFieldPuns
|
||||
OverloadedStrings
|
||||
PartialTypeSignatures
|
||||
PatternGuards
|
||||
PatternSynonyms
|
||||
PolyKinds
|
||||
RankNTypes
|
||||
RecordWildCards
|
||||
ScopedTypeVariables
|
||||
StandaloneDeriving
|
||||
TemplateHaskell
|
||||
TupleSections
|
||||
TypeFamilies
|
||||
TypeSynonymInstances
|
||||
ViewPatterns
|
||||
ghc-options: -Wall -Werror -Wcompat -Widentities -Wincomplete-patterns -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-deriving-strategies -Wmissing-home-modules -Wname-shadowing -Wpartial-fields -Wredundant-constraints -Wunused-packages -Wunused-type-patterns -threaded -rtsopts -with-rtsopts=-N
|
||||
build-depends:
|
||||
base >=4.7 && <5
|
||||
, turing-hs
|
||||
default-language: Haskell2010
|
Loading…
Reference in New Issue
Block a user