在Haskell中,我写import Fruit或import Fruit (apple) 可以访问apple或Fruit.apple.
在Python,我可以写from Fruit import apple为apple或import Fruit为Fruit.apple.
我想也可以用import Fruit.apple as bananaPython 编写引用相同的函数banana.
怎么,在Haskell中我可以这样做吗?import Fruit as Vegetable在任何一种语言中都可以重命名Fruit,但我想重命名apple.
sab*_*uma 18
这是Python的一个不错的属性,因为它的"词典一直在下",可以这么说.Haskell允许您为模块分配别名,但是没有办法在import语句中对函数进行别名(据我所知).你能做的最好的是
import qualified Fruit as F (apple)
banana = F.apple
Run Code Online (Sandbox Code Playgroud)
你可以将它放在自己的模块中并导出你想要的值,隐藏所有这些的细节,但这似乎很简单.
正如下面由hammar评论的那样,单态限制可能会导致推断类型的问题banana.为了安全起见,您应该banana使用其所需类型(可能是其类型apple)进行注释,或者禁用单态性限制
{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Fruit as F (apple)
banana = F.apple
Run Code Online (Sandbox Code Playgroud)
否则,推断类型banana可能比期望的更少多态.
Monomorphism限制尝试为每个顶级函数分配一个类型类的具体实例(这是出于性能原因而完成的).考虑,
example = return ()
Run Code Online (Sandbox Code Playgroud)
这个函数应该有类型Monad m => m (),但是由于单态限制,没有足够的信息关于应该使用哪个Monad实例,所以你得到以下消息
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 ()
Run Code Online (Sandbox Code Playgroud)
现在,如果您为GHC提供足够的信息来推断您正在使用的Monad实例,例如
example = return ()
main :: IO ()
main = example
Run Code Online (Sandbox Code Playgroud)
那么GHC将提供以下类型
*Main> :t example
example :: IO ()
Run Code Online (Sandbox Code Playgroud)
因为你告诉它将example具有相同的类型main
直接没有这种语法.大概你想要避免与本地定义的冲突apple,所以我会去
import qualified Fruit (apple)
banana = Fruit.apple
Run Code Online (Sandbox Code Playgroud)