gpt4 book ai didi

haskell - 处理 Haskell 中的歧义事件

转载 作者:行者123 更新时间:2023-12-04 01:12:29 26 4
gpt4 key购买 nike

我正在导入 Data.TextData.List,它们各自的 find 函数崩溃了。

import Data.Text
import Data.List

my_list = [4, 2, 4, 5, 6, 2, 6]
find (\a -> a == 5) my_list

上面的代码导致了下面的错误

    Ambiguous occurrence ‘find’
It could refer to
either ‘Data.Text.find’, imported from ‘Data.Text’
or ‘Data.List.find’,
imported from ‘Data.List’
(and originally defined in ‘Data.Foldable’)

这里唯一的解决方案是使用 Data.List.find (\a -> a == 5) my_list 还是合格的导入?

让我印象深刻的是

Data.List.find (\a -> a == 5) my_list
--> Just 5

Data.Text.find (\a -> a == 5) my_list
--> error: Couldn't match expected type ‘Text’ with actual type ‘[Integer]’

根据 find 函数签名,编译器显然能够理解 Data.Text.find 不适用于 [Integer]。他不能使用此信息来决定使用哪个 find 实例,并且在这种情况下,自动使用 Data.List 中的 find

最佳答案

Is the only solution to use Data.List.find (\a -> a == 5) my_list here, or qualified imports?

据我所知,是的,没有其他解决方案。

编译器不会尝试对这两个选项进行类型检查并使用使您的代码编译的选项。在最一般的情况下,这可能导致指数级的爆炸式增长。考虑一下,例如,

foo a1 a2 .... aN

a1 .. aN 中的每一个都是从两个不同的模块导入的。尝试对哪些组合进行类型检查原则上需要测试 2^N 种组合。

此外,程序员总是有可能打算使用模块中的标识符,但他们犯了一个错误,代码没有进行类型检查。在这种情况下,来自其他模块的相同标识符可能会进行类型检查,从而使代码编译但产生错误的结果。 (我知道这是一个相当人为的例子。)


请注意,如果在您的导入模块中您只需要使用两个 find 之一,您可以隐藏另一个:

import Data.Text hiding (find)
import Data.List

或者,您可以提供明确的不相交导入列表:

import Data.Text (pack)
import Data.List (find, zip)

如果您需要两个find,您可以为模块提供一个较短的名称

import Data.Text as T
import Data.List as L

然后使用 L.find 消除歧义。除了双重导入的标识符之外,您不需要更短的模块名称。如果您使用 import qualified,您将需要为所有导入的标识符指定模块名称。

关于haskell - 处理 Haskell 中的歧义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64411527/

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