gpt4 book ai didi

haskell - 在 Haskell 中使用别名导入函数

转载 作者:行者123 更新时间:2023-12-03 12:44:41 24 4
gpt4 key购买 nike

在 Haskell 中,我写 import Fruitimport Fruit (apple)并且可以访问appleFruit.apple .

在 Python 中,我可以写 from Fruit import apple对于 appleimport Fruit对于 Fruit.apple .

我觉得也可以写import Fruit.apple as banana在 Python 中引用与 banana 相同的函数.

我如何在 Haskell 中做到这一点? import Fruit as Vegetable任何一种语言都可以重命名水果,但我想重命名苹果。

最佳答案

这是 Python 的一个很好的属性,因为它的“字典一直向下”可以这么说。
Haskell 允许你给模块分配别名,但是没有办法给函数取别名
来自 import声明(据我所知)。你能做的最好的就是

import qualified Fruit as F (apple)
banana = F.apple

你可以把它放在它自己的模块中并导出你想要的值,隐藏所有这些的细节,但对于如此简单的事情来说,这似乎需要做很多工作。

正如 hammar 在下面评论的那样,单态性限制可能会导致推断类型出现问题
banana .为了安全起见,您应该注释 banana具有所需的类型(可能是 apple 的类型),或者禁用单态限制为
{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Fruit as F (apple)
banana = F.apple

否则, banana 的推断类型可能比期望的多态性更少。

单态限制尝试为每个顶级函数分配一个类型类的具体实例(这是出于性能原因)。考虑,
example = return ()

此函数应具有类型 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 ()

现在,如果您为 GHC 提供了足够的信息来推断您正在使用哪个 Monad 实例,例如
example = return ()

main :: IO ()
main = example

那么GHC会给出以下类型
*Main> :t example
example :: IO ()

既然你告诉它 example将具有与 main 相同的类型

关于haskell - 在 Haskell 中使用别名导入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12655803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com