gpt4 book ai didi

haskell - 在 Haskell 中导入 Prelude 中已经定义的东西的正确方法

转载 作者:行者123 更新时间:2023-12-03 20:28:17 26 4
gpt4 key购买 nike

我正在尝试在 Haskell 中定义一个 Foldable 实例,但我在导入时遇到了一些问题。

所以首先尝试:
模块 MyList
在哪里

import Data.Foldable

data MyList a = MyList [a]

instance Foldable (MyList) where
foldr f b (MyList as) = foldr f b as

结果(正常但烦人)

Ambiguous occurrence `foldr'



所以,我想我必须从 Prelude 中隐藏它:
模块 MyList
在哪里
import Prelude hiding (foldr)
import Data.Foldable

data MyList a = MyList [a]

instance Foldable (MyList) where
foldr f b (MyList as) = foldr f b as

这个编译,我加载到 ghci 并尝试一些基本的东西:
*MyList> foldr (:) "" (MyList "hello")
"hello"
*MyList> foldl (flip (:)) "" (MyList "hello")

<interactive>:1:0:
Ambiguous occurrence `foldl'
It could refer to either `Prelude.foldl', imported from Prelude at MyList.hs:4:0-28
or `Data.Foldable.foldl', imported from Data.Foldable at MyList.hs:5:0-19
*MyList>

所以 foldr 有效,但 foldl 没有。我的第一个问题是
我是否必须从 Prelude 中手动隐藏 Data.Foldable 中定义的每一个方法是他们这样做的好方法吗?

为了避免这个问题,我尝试了一个合格的导入:
模块 MyList
在哪里
import qualified  Data.Foldable as F

data MyList a = MyList [a]

instance F.Foldable (MyList) where
foldr f b (MyList as) = foldr f b as

似乎在 ghc 中编译,但是
*MyList> foldr (:) "" (MyList "hello")

<interactive>:1:14:
Couldn't match expected type `[Char]'
against inferred type `MyList Char'
In the third argument of `foldr', namely `(MyList "hello")'
In the expression: foldr (:) "" (MyList "hello")
In the definition of `it': it = foldr (:) "" (MyList "hello")

没有找到 foldr 但令人惊讶的是 F.foldr 在 ghci 中工作。
*MyList> F.foldr (:) "" (MyList "hello")
"hello"

但仅在 ghci 中,如果我试图在文件中导入 MyList,foldr、F.foldr、MyList.F.foldr 和 MyList.foldr 不起作用。

为什么它在 ghci 中有效但在实际中无效?

我想我必须再次导入 Data.Foldable(并在使用 MyList 的每个文件中再次导入)

有没有更好的方法(比如在 MyList 中导出 Data.Foldable)?

(我是 Haskell 的新手,尤其是模块)

在得到了几个回应之后,似乎这个问题没有干净的解决方案。但是,我很确定我不是第一个这样做的人,所以

处理这类问题的常见做法是什么?

谢谢你的帮助。

最佳答案

为什么它在 ghci 中有效,但在实际中无效?

因为在您的 GHCi session 中,您在 MyList 的上下文中键入表达式。模块,所以 F.foldr在范围内,但如果您导入 MyList进入另一个模块,然后只有 MyList 导出的名称,以及您导入的其他模块,都在范围内。

您的猜测是正确的 - 在每个模块中使用 Data.Foldable.foldr , 你必须

import qualified Data.Foldable as F

模块导出的名称是不合格的;这些名称的限定与否是在导入模块时决定的。

多年来一直有建议允许导出合格名称,但迄今为止尚未实现。

关于haskell - 在 Haskell 中导入 Prelude 中已经定义的东西的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175583/

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