Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I import a text file in a cabal project?

Tags:

haskell

cabal

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
like image 787
michaelAdam Avatar asked Nov 24 '18 12:11

michaelAdam


1 Answers

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.

like image 196
michaelAdam Avatar answered Nov 05 '22 09:11

michaelAdam