[commit: packages/filepath] master: #12, add notes on why FilePath isn't abstract (59b8639)
git at git.haskell.org
git at git.haskell.org
Mon Dec 28 20:39:36 UTC 2015
Repository : ssh://git@git.haskell.org/filepath
On branch : master
Link : http://git.haskell.org/packages/filepath.git/commitdiff/59b8639890fbf246d46a66147191458d1587fb98
>---------------------------------------------------------------
commit 59b8639890fbf246d46a66147191458d1587fb98
Author: Neil Mitchell <ndmitchell at gmail.com>
Date: Tue Dec 22 07:51:11 2015 +0000
#12, add notes on why FilePath isn't abstract
>---------------------------------------------------------------
59b8639890fbf246d46a66147191458d1587fb98
README.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/README.md b/README.md
index f2ff622..536f88c 100644
--- a/README.md
+++ b/README.md
@@ -7,3 +7,12 @@ The `filepath` package provides functionality for manipulating `FilePath` values
* [`System.FilePath`](http://hackage.haskell.org/package/filepath/docs/System-FilePath.html) is an alias for the module appropriate to your platform.
All three modules provide the same API, and the same documentation (calling out differences in the different variants).
+
+### Should `FilePath` be an abstract data type?
+
+The answer for this library is "no". While an abstract `FilePath` has some advantages (mostly type safety), it also has some disadvantages:
+
+* In Haskell the definition is `type FilePath = String`, and all file-orientated functions operate on this type alias, e.g. `readFile`/`writeFile`. Any abstract type would require wrappers for these functions or lots of casts between `String` and the abstraction.
+* It is not immediately obvious what a `FilePath` is, and what is just a pure `String`. For example, `/path/file.ext` is a `FilePath`. Is `/`? `/path`? `path`? `file.ext`? `.ext`? `file`?
+* Often it is useful to represent invalid files, e.g. `/foo/*.txt` probably isn't an actual file, but a glob pattern. Other programs use `foo//bar` for globs, which is definitely not a file, but might want to be stored as a `FilePath`.
+* Some programs use syntactic non-semantic details of the `FilePath` to change their behaviour. For example, `foo`, `foo/` and `foo/.` are all similar, and refer to the same location on disk, but may behave differently when passed to command-line tools.
More information about the ghc-commits
mailing list