gpt4 book ai didi

haskell - 为什么 GHC 无法确定在此 case 语句中使用哪个字段?

转载 作者:行者123 更新时间:2023-12-02 10:03:42 25 4
gpt4 key购买 nike

{-# LANGUAGE DuplicateRecordFields #-}

resolveProjectConfig :: IO (Maybe ProjectConfig)

config :: IO ()
config = do
config <- resolveProjectConfig
case config of
Just c -> putStrLn (name c)
Nothing -> putStrLn "broken"

GHC 似乎知道在 Just c 中 c 是一个 ProjectConfig,但在 putStrLn (name c) 中,我收到错误“不明确”事件名称。它可以指字段名称...[具有名称字段的其他内容的列表]”。

如果它知道c是什么,它应该能够选择正确的名称函数吗?有没有办法让它弄清楚,而不添加 c::ProjectConfig

最佳答案

这是 GHC 当前的限制。我们需要编写name (c::ProjectConfig)来消除歧义。不太方便。

作为替代方案,您可以对信息更丰富的模式进行模式匹配(按照 Willem Van Onsem 的建议):

case config of
Just (ProjectConfig {name=n}) -> putStrLn n

这将消除歧义,因为 name 仅在 ProjectConfig 之后的模式中使用,因此它被接受。

另一种更麻烦的替代方法是使用自定义类型类。假设所有 name 字段都是字符串,我们可以使用:

class HasName a where
getName :: a -> String

instance HasName ProjectConfig where
getName = name

instance HasName Other where -- for other types having the same field
getName = name

config :: IO ()
config = do
config <- resolveProjectConfig
case config of
Just c -> putStrLn (getName c)
...

(我无法理解为什么这不会在幕后自动完成。)

关于haskell - 为什么 GHC 无法确定在此 case 语句中使用哪个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57181359/

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