gpt4 book ai didi

haskell - 为什么这些实例不产生重叠实例错误

转载 作者:行者123 更新时间:2023-12-02 08:38:19 25 4
gpt4 key购买 nike

让我们定义一个 collapse 函数,它将任何可能嵌套的 Maybe (Maybe (... a)...) 折叠为 Maybe a :

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE IncoherentInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoOverlappingInstances #-}
{-# LANGUAGE TypeFamilies #-}

module MaybeCollapsable where

class M a b where
collapse :: Maybe a -> Maybe b

instance (a ~ b) => M a b where
collapse = id

instance M a b => M (Maybe a) b where
collapse Nothing = Nothing
collapse (Just a) = collapse a

效果不错

> collapse (Just (Just (Just 1)))
Just 1

虽然,很奇怪。这两个实例似乎都适合该特定情况(a ~ Maybe xb ~ Maybe x),但编译器不会产生 Overlapping Instances 错误。

它如何与 -XNoOverlappingInstances 配合使用?

顺便说一句,定义这种折叠嵌套Maybe的方法是否安全可用?

最佳答案

我认为问题可能是 IncoherentInstances 覆盖了 NoOverlappingInstances 指令。如果您删除 IncoherentInstances,代码会给出重叠实例错误。 GHC 手册对此并不清楚 (http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/type-class-extensions.html#instance-overlap),但这两个标志确实相关。

如果您关闭 IncoherentInstances 并打开 OverlappingInstances,您的代码可以正常工作。所以删除 IncoherentInstances 标志,我认为行为将如您最初预期的那样:重叠实例标志使工作和不工作之间有所不同。

关于haskell - 为什么这些实例不产生重叠实例错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19065899/

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