In app/Main.hs, I want to open a text file, "foo.txt". I know how to open a text file in a plain Haskell program. In my cabal project,
import System.IO
Main = do
    contents <- readFile "foo.txt"
    print $ Main.lex contents
    return contents
type Keyword = String
lex :: String -> [Keyword]
lex "" = []
lex x = words x
gives the error
openFile: does not exist (No such file or directory)
What do I need to change in my cabal file, or the file path or location to be able to open the file? I've tried putting it next to the output binary, and that doesn't work either.
This is my cabal file:
-- This file has been generated from package.yaml by hpack version 0.28.2.
--
-- see: https://github.com/sol/hpack
--
-- hash: baf2fc7e230f4b4937dfd918a13fefb55b66c7a4468b24d0e3e90cad675b26d5
name:           CCompiler
version:        0.1.0.0
description:    Please see the README on GitHub at <https://github.com/githubuser/CCompiler#readme>
homepage:       https://github.com/githubuser/CCompiler#readme
bug-reports:    https://github.com/githubuser/CCompiler/issues
author:         Author name here
maintainer:     [email protected]
copyright:      2018 Author name here
license:        BSD3
license-file:   LICENSE
build-type:     Simple
cabal-version:  >= 1.10
extra-source-files:
    ChangeLog.md
    README.md
source-repository head
  type: git
  location: https://github.com/githubuser/CCompiler
library
  exposed-modules:
      Lib
  other-modules:
      Paths_CCompiler
  hs-source-dirs:
      src
  build-depends:
      base >=4.7 && <5
  default-language: Haskell2010
executable CCompiler-exe
  main-is: Main.hs
  other-modules:
      Paths_CCompiler
  hs-source-dirs:
      app
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      CCompiler
    , base >=4.7 && <5
  default-language: Haskell2010
test-suite CCompiler-test
  type: exitcode-stdio-1.0
  main-is: Spec.hs
  other-modules:
      Paths_CCompiler
  hs-source-dirs:
      test
  ghc-options: -threaded -rtsopts -with-rtsopts=-N
  build-depends:
      CCompiler
    , base >=4.7 && <5
  default-language: Haskell2010
add
data-dir: data
in the top section of the cabal file.
create the directory 'data' next to src and app, and put all files in there.
Make sure your cabal file also has this line
other-modules:
  Paths_CCompiler
with your project's name instead of CCompiler.
My main function is now this
module Main where
import Lib
import System.IO
import Paths_CCompiler
main = do
    filepath <- getDataFileName "return_2.c"
    contents <- readFile filepath
    print $ Lib.lex contents
    return contents
Thanks to this blog post.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With