In Haskell, I write import Fruit or import Fruit (apple) and can access apple or Fruit.apple.
In Python, I can write from Fruit import apple for apple or import Fruit for Fruit.apple.
I think can also write import Fruit.apple as banana in Python to reference the same function as banana.
How, in Haskell can I do this? import Fruit as Vegetable in either language can rename Fruit, but I want to rename apple.
The syntax for importing modules in a Haskell script is import <module name>. This must be done before defining any functions, so imports are usually done at the top of the file. One script can, of course, import several modules. Just put each import statement into a separate line.
A qualified import allows using functions with the same name imported from several modules, e.g. map from the Prelude and map from Data.
This is a nice property Python has because its "dictionaries all the way down," so to speak. Haskell allows you to assign aliases to modules, but there is no way to alias functions from the import statement (as far as I know). The best you would be able to do is
import qualified Fruit as F (apple) banana = F.apple You could put this in its own module and export the values you want, hiding the details of all this, but that seems like a lot of work for something so simple.
As commented below by hammar, the monomorphism restriction could cause trouble with the inferred type of banana. To be safe, you should either annotate banana with its desired type (probably that of apple), or disable the monomorphism restriction as
{-# LANGUAGE NoMonomorphismRestriction #-} import qualified Fruit as F (apple) banana = F.apple Otherwise, the inferred type of banana could be less polymorphic than desired.
The Monomorphism restriction attempts to assign a concrete instance of a type class for each top level function (this is done for performance reasons). Consider,
example = return () This function should have type Monad m => m (), but due to the monomorphism restriction, there is not enough information about which Monad instance should be used, so you get the following message
Ambiguous type variable `m0' in the constraint: (Monad m0) arising from a use of `return' Possible cause: the monomorphism restriction applied to the following: example :: m0 () (bound at Test.hs:44:1) Probable fix: give these definition(s) an explicit type signature or use -XNoMonomorphismRestriction In the expression: return () In an equation for `example': example = return () Now, if you provide enough information for GHC to infer which instance of Monad you are using, such as
example = return () main :: IO () main = example then GHC will give the following type
*Main> :t example example :: IO () since you told it that example will have the same type as main
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