3 ms·
Haskell namespaces are a bit annoying. let's look at the stdlib `replicate` function. `replicate 5 'x'` gets you `['x', 'x', 'x', 'x', 'x']`. But that's a stan
by uryga 10y ago
Haskell namespaces are a bit annoying.
let's look at the stdlib `replicate` function. `replicate 5 'x'` gets you `['x', 'x', 'x', 'x', 'x']`. But that's a standard haskell linked list, and there's other list-y things, like ByteString. So there's bytestring module has it's own replicate function which returns a ByteString (like an array afaik) instead of a list.
Now, a bare `import bytestring` just dumps all of the module - its datatypes, its functions - into the global namespace, like a Python `from bytestring import *`, so the two replicate functions are gonna clash. There's a solution - we do `import qualified bytestring`. it behaves like a normal Python `import bytestring`, which means that we have to type `bytestring.replicate` to get that function from earlier. all of the stuff inside the bytestring module is hidden away inside this namespace.
Now, the trouble is, EVERYTHING is hidden away. So, say I want to refer to the actual ByteString datatype, say to write a type signature like:
```
length :: Bytestring a -> Int
```
Now, because of the namespace qualification I did, I actually have to write the verbose
```
length :: bytestring.ByteString a -> Int
```
So that's like saying "bytestring-module.ByteString-datatype" every time you want use a ByteString. that's what the author does, hence the weird duplication you noticed comes from.
The usual solution is:
```
import qualified Data.ByteString as B -- the functions
import Data.ByteString (ByteString) -- the datatype
```
which roughly translates to Python as:
```
import bytestring as B
from bytestring import ByteString # the ByteString class
```
so now, I can use `B.replicate`, and `ByteString`, which is what I want! Great! But the importing is verbose and, as I said, kinda annoying.
- deleted 10y ago[deleted]