├── .gitignore ├── LICENSE ├── README.md ├── Setup.hs ├── Tic-Tac-Toe.cabal ├── screen_shots ├── computer.png ├── draw.png ├── game.gif └── player.png ├── src ├── Main.hs └── TicTacToe.hs └── stack.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | cabal-dev 3 | *.o 4 | *.hi 5 | *.chi 6 | *.chs.h 7 | *.dyn_o 8 | *.dyn_hi 9 | .hpc 10 | .hsenv 11 | .cabal-sandbox/ 12 | cabal.sandbox.config 13 | *.prof 14 | *.aux 15 | *.hp 16 | .stack-work/ 17 | 18 | .stack-work/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Tic-Hack-Toe](https://hackage.haskell.org/package/Tic-Tac-Toe-0.1.0.2) 2 | 3 | ![Game Gif](screen_shots/game.gif) 4 | 5 | Bored, tired, or just need a break? Play a quick game of tic tac toe against your computer in the command line! 6 | 7 | Programmed in Haskell with :heart: at Hack the North 2015. 8 | 9 | # Usage 10 | 11 | $ cabal update 12 | $ cabal install Tic-Tac-Toe 13 | $ Tic-Tac-Toe 14 | 15 | # Name 16 | 17 | Tic-Hack-Toe. Get it? Because the Tic-Tac-To game was made at a hackathon and also because it was made in Haskell :sunglasses:. 18 | 19 | 20 | # TODO 21 | 22 | I would love any contributions! Feel free to open up an issue or a PR if you think you can help. The code is pretty simple, so its even pretty beginner friendly. 23 | 24 | - Add tests 25 | - Fix AI to not just choose the first possible move if it doesn't have a move it needs to make 26 | - Apparently X goes first, not O, so fix that 27 | - Look into colored output for the X's and the O's for a better UI 28 | -------------------------------------------------------------------------------- /Setup.hs: -------------------------------------------------------------------------------- 1 | import Distribution.Simple 2 | main = defaultMain 3 | -------------------------------------------------------------------------------- /Tic-Tac-Toe.cabal: -------------------------------------------------------------------------------- 1 | -- Initial TicTacToe.cabal generated by cabal init. For further 2 | -- documentation, see http://haskell.org/cabal/users-guide/ 3 | 4 | name: Tic-Tac-Toe 5 | version: 0.1.0.2 6 | synopsis: Tic Tac Toe in your command line! 7 | description: Bored, tired, or just need a break? Play a quick game of tic tac toe against your computer in the command line! 8 | homepage: https://github.com/2016rshah/Tic-Hack-Toe 9 | license: Apache-2.0 10 | license-file: LICENSE 11 | author: Rushi Shah 12 | 13 | maintainer: 2016rshah@gmail.com 14 | 15 | -- copyright: 16 | category: Game 17 | build-type: Simple 18 | -- extra-source-files: 19 | cabal-version: >=1.10 20 | 21 | executable Tic-Tac-Toe 22 | main-is: Main.hs 23 | -- Modules exported by the library. 24 | -- exposed-modules: 25 | 26 | -- Modules included in this library but not exported. 27 | other-modules: TicTacToe 28 | 29 | build-depends: base >= 2 && < 5 30 | , safe -any 31 | hs-source-dirs: src 32 | default-language: Haskell2010 33 | 34 | source-repository head 35 | type: git 36 | location: https://github.com/2016rshah/Tic-Hack-Toe.git -------------------------------------------------------------------------------- /screen_shots/computer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2016rshah/Tic-Hack-Toe/e96fa9869f2a15c8cde30c9606ef52d24a27508d/screen_shots/computer.png -------------------------------------------------------------------------------- /screen_shots/draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2016rshah/Tic-Hack-Toe/e96fa9869f2a15c8cde30c9606ef52d24a27508d/screen_shots/draw.png -------------------------------------------------------------------------------- /screen_shots/game.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2016rshah/Tic-Hack-Toe/e96fa9869f2a15c8cde30c9606ef52d24a27508d/screen_shots/game.gif -------------------------------------------------------------------------------- /screen_shots/player.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/2016rshah/Tic-Hack-Toe/e96fa9869f2a15c8cde30c9606ef52d24a27508d/screen_shots/player.png -------------------------------------------------------------------------------- /src/Main.hs: -------------------------------------------------------------------------------- 1 | module Main where 2 | 3 | import TicTacToe 4 | import System.IO 5 | 6 | -- |Greet user, start recursion, and say farewell to user when game ends 7 | main :: IO () 8 | main = do 9 | putStrLn "Welcome to tic tac toe." 10 | 11 | --start recursion 12 | playerMove emptyBoard 13 | 14 | putStrLn "Thanks for playing!" 15 | 16 | -- |Helper function to ensure prompt is made before user is expected to input something 17 | promptLine :: String -> IO String 18 | promptLine text = do 19 | putStr text 20 | hFlush stdout 21 | getLine 22 | 23 | -- |Code common to both player and computer at the end of the game 24 | endRecursion :: Board -> IO () 25 | endRecursion b = do 26 | putStrLn (show b) 27 | putStrLn (winner b) -- end recursion 28 | 29 | -- |Grab the user's move, and feed that to tic-tac-toe. Recurse as needed. 30 | playerMove :: Board -> IO () 31 | playerMove board = do 32 | putStrLn (show board) 33 | loc <- promptLine "Where do you want to place your X? " 34 | putStrLn "" 35 | let moveLoc = Left (read loc) 36 | let newBoard = findAndReplace board moveLoc (Right X) 37 | if won newBoard || draw newBoard 38 | then endRecursion newBoard 39 | else compMove newBoard -- continue recursion 40 | 41 | -- |Make a decision based on the board on where to move. Recurse as needed. 42 | compMove :: Board -> IO () 43 | compMove board = do 44 | let newBoard = makeOMove board 45 | if won newBoard || draw newBoard 46 | then endRecursion newBoard -- end recursion 47 | else playerMove newBoard -- continue recursion 48 | -------------------------------------------------------------------------------- /src/TicTacToe.hs: -------------------------------------------------------------------------------- 1 | module TicTacToe where 2 | 3 | {-# LANGUAGE FlexibleInstances #-} 4 | 5 | 6 | import Data.Either 7 | import Safe 8 | import Data.Maybe 9 | import Data.List 10 | 11 | -- |Slots in the board can either be filled with Naughts or Crosses 12 | data Symbol = X | O 13 | deriving (Show, Eq) 14 | 15 | -- |Empty slots are referred to by their location on the board 16 | type Piece = Either Int Symbol 17 | 18 | -- |A set of three pieces is used to represent rows, columns, and diagonals 19 | type Three = [Piece] -- how do I constrain this to a length of three? 20 | 21 | -- |The game board is made up of three rows of three pieces each. 22 | data Board = Board Three Three Three 23 | deriving (Eq) 24 | 25 | --Thank you to http://projects.haskell.org/operational/examples/TicTacToe.hs.html for the show function 26 | instance Show Board where 27 | show board = 28 | unlines . surround "+---+---+---+" 29 | . map (concat . surround "|". map showSquare) 30 | $ (rows board) 31 | where 32 | surround x xs = [x] ++ intersperse x xs ++ [x] 33 | showSquare = either (\n -> " " ++ show n ++ " ") (\n -> color n) 34 | 35 | -- | \ESC[ for ANSI escape 36 | esc :: Int -> String 37 | esc i = concat ["\ESC[", show i, "m"] 38 | 39 | -- | Black=30, Red=31, Green=32, Yellow=33, Blue=34, Magenta=35, Cyan=36, White=37 40 | color :: Symbol -> String 41 | color s 42 | | s == X = esc 32++" "++show s++" "++esc 0 43 | | otherwise = esc 31++" "++show s++" "++esc 0 44 | 45 | -- |Convenience function for constructing an empty board 46 | emptyBoard :: Board 47 | emptyBoard = Board [Left 1, Left 2, Left 3] [Left 4, Left 5, Left 6] [Left 7, Left 8, Left 9] 48 | 49 | -- |Given either a row, column, or diagonal, it checks whether it is entirely filled with naughts or crosses 50 | full :: Three -> Bool 51 | full ts@[a,b,c] = noLefts && allEqual 52 | where 53 | noLefts = foldl (\acc curr -> acc && (isRight curr)) True ts 54 | allEqual = a == b && b == c 55 | 56 | -- |Given a game board, check whether the game is over because someone won 57 | won :: Board -> Bool 58 | won b = foldl (\acc curr -> acc || (full curr)) False ((rows b) ++ (cols b) ++ (diags b)) 59 | 60 | -- |Given a game board, check whether the game is over due to a draw 61 | draw :: Board -> Bool 62 | draw b = length (possibleMoves b) == 0 63 | 64 | -- |Message to display to the user about the results of the game 65 | winner :: Board -> String 66 | winner b = if length winnerType > 0 then head winnerType else "It was a draw!" 67 | where 68 | allConfigs = ((rows b) ++ (cols b) ++ (diags b)) 69 | winnerType = [if a == (Right O) then "The computer wins!" else "You win!" | curr@[a,b,c] <- allConfigs, full curr] 70 | 71 | -- |Extract rows from game board 72 | rows :: Board -> [Three] 73 | rows (Board x y z) = [x, y, z] 74 | 75 | -- |Extract columns from game board 76 | cols :: Board -> [Three] 77 | cols (Board [a, b, c] [d, e, f] [g, h, i]) = [[a, d, g], [b, e, h], [c, f, i]] 78 | 79 | -- |Extract diagonals from game board 80 | diags :: Board -> [Three] 81 | diags (Board [a, _, c] [_, e, _] [g, _, i]) = [[a, e, i], [c, e, g]] 82 | 83 | -- |List of places where a piece can be placed 84 | possibleMoves :: Board -> [Piece] 85 | possibleMoves board = filter isLeft (boardToList board) 86 | 87 | -- |Helper function to convert a board into a list of values 88 | boardToList :: Board -> [Piece] 89 | boardToList (Board x y z) = x ++ y ++ z 90 | 91 | -- |Helper function to convert a list of values into a board 92 | listToBoard :: [Piece] -> Board 93 | listToBoard [a,b,c,d,e,f,g,h,i] = Board [a,b,c] [d,e,f] [g,h,i] 94 | 95 | -- |Function to update the game board with a new value at a specified point 96 | findAndReplace :: Board -> Piece -> Piece -> Board 97 | findAndReplace b p1 p2 = listToBoard [if x==p1 then p2 else x | x <- bl] 98 | where bl = boardToList b 99 | 100 | -- |Check if O's can immediately win, and if so, do it 101 | winningOMove :: Board -> Maybe Board 102 | winningOMove b = headMay [findAndReplace b p (Right O) | p <- (possibleMoves b), won (findAndReplace b p (Right O))] 103 | 104 | -- |Check if X's can immediately win, and if so, block it 105 | blockXWin :: Board -> Maybe Board 106 | blockXWin b = headMay [findAndReplace b p (Right O) | p <- (possibleMoves b), won (findAndReplace b p (Right X))] 107 | 108 | -- |Check whether a board has been forked 109 | isFork :: Board -> Bool 110 | isFork b = 2 == length [findAndReplace b p (Right O) | p <- (possibleMoves b), won (findAndReplace b p (Right O))] 111 | 112 | -- |Check if O's can make a fork, and if so, do it 113 | forkO :: Board -> Maybe Board 114 | forkO b = headMay [findAndReplace b p (Right O) | p <- (possibleMoves b), isFork (findAndReplace b p (Right O))] 115 | 116 | -- |Check if X's can make a fork, and if so, block it 117 | blockXFork :: Board -> Maybe Board 118 | blockXFork b = headMay [findAndReplace b p (Right O) | p <- (possibleMoves b), isFork (findAndReplace b p (Right X))] 119 | 120 | -- |Decision tree for AI that will go down the list to make its move 121 | makeOMove :: Board -> Board 122 | makeOMove board@(Board x@[a, b, c] y@[d, e, f] z@[g, h, i]) 123 | | isJust (winningOMove board) = fromJust (winningOMove board) 124 | | isJust (blockXWin board) = fromJust (blockXWin board) 125 | | isJust (forkO board) = fromJust (forkO board) 126 | | isJust (blockXFork board) = fromJust (blockXFork board) 127 | | elem e (possibleMoves board) = findAndReplace board e (Right O) 128 | | otherwise = if length (possibleMoves board) > 0 129 | then findAndReplace board (head (possibleMoves board)) (Right O) 130 | else board --This should not happen 131 | -------------------------------------------------------------------------------- /stack.yaml: -------------------------------------------------------------------------------- 1 | # This file was automatically generated by 'stack init' 2 | # 3 | # Some commonly used options have been documented as comments in this file. 4 | # For advanced use and comprehensive documentation of the format, please see: 5 | # http://docs.haskellstack.org/en/stable/yaml_configuration/ 6 | 7 | # Resolver to choose a 'specific' stackage snapshot or a compiler version. 8 | # A snapshot resolver dictates the compiler version and the set of packages 9 | # to be used for project dependencies. For example: 10 | # 11 | # resolver: lts-3.5 12 | # resolver: nightly-2015-09-21 13 | # resolver: ghc-7.10.2 14 | # resolver: ghcjs-0.1.0_ghc-7.10.2 15 | # resolver: 16 | # name: custom-snapshot 17 | # location: "./custom-snapshot.yaml" 18 | resolver: lts-7.2 19 | 20 | # User packages to be built. 21 | # Various formats can be used as shown in the example below. 22 | # 23 | # packages: 24 | # - some-directory 25 | # - https://example.com/foo/bar/baz-0.0.2.tar.gz 26 | # - location: 27 | # git: https://github.com/commercialhaskell/stack.git 28 | # commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a 29 | # - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a 30 | # extra-dep: true 31 | # subdirs: 32 | # - auto-update 33 | # - wai 34 | # 35 | # A package marked 'extra-dep: true' will only be built if demanded by a 36 | # non-dependency (i.e. a user package), and its test suites and benchmarks 37 | # will not be run. This is useful for tweaking upstream packages. 38 | packages: 39 | - '.' 40 | # Dependency packages to be pulled from upstream that are not in the resolver 41 | # (e.g., acme-missiles-0.3) 42 | extra-deps: [] 43 | 44 | # Override default flag values for local packages and extra-deps 45 | flags: {} 46 | 47 | # Extra package databases containing global packages 48 | extra-package-dbs: [] 49 | 50 | # Control whether we use the GHC we find on the path 51 | # system-ghc: true 52 | # 53 | # Require a specific version of stack, using version ranges 54 | # require-stack-version: -any # Default 55 | # require-stack-version: ">=1.2" 56 | # 57 | # Override the architecture used by stack, especially useful on Windows 58 | # arch: i386 59 | # arch: x86_64 60 | # 61 | # Extra directories used by stack for building 62 | # extra-include-dirs: [/path/to/dir] 63 | # extra-lib-dirs: [/path/to/dir] 64 | # 65 | # Allow a newer minor version of GHC than the snapshot specifies 66 | # compiler-check: newer-minor --------------------------------------------------------------------------------