gpt4 book ai didi

haskell - 重叠实例——不清楚 Haskell 选择了哪个实例

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

我有以下使用重叠实例的 Haskell 代码;我尝试实现一个函数,该函数将函数的类型生成为字符串,或者 - 更一般地说 - 对不同的函数类型执行不同的操作:

{-# OPTIONS_GHC -fglasgow-exts #-}
{-# LANGUAGE OverlappingInstances, IncoherentInstances #-}

module Test
where

data TypeString = MKTS String

instance Show TypeString where
show (MKTS s) = s

class ShowType b c where
theType :: (b -> c) -> TypeString

instance ShowType b b where
theType _ = MKTS "b -> b"

instance ShowType b c where
theType _ = MKTS "b -> c"

instance ShowType (b, b') c where
theType _ = MKTS "(b, b') -> c"

class Problem a where
showProblem :: a -> TypeString

instance Problem (b -> c) where
showProblem f = theType f

Haskell 在我键入时显示预期的行为

> theType (uncurry (+))
(b,b') -> c

但是:任何人都可以解释以下内容:

> showProblem (uncurry (+))
b -> c

...并解释一下,如何避免 Haskell 选择过于通用的实例的情况...

最佳答案

使用的Problem实例是为b -> c制作的。如果您查看 showProblem 的签名,您会发现没有 ShowType 上下文。如果没有上下文,编译器只能静态推断实例。因此,选择了 b -> c 的实例,因为它是静态拟合的实例。

我不知道如何解决这个问题,恕我直言,它可以手动提供上下文,但我真的不知道:

class Problem a where
showProblem :: ShowType a => a -> TypeString

instance Problem (b -> c) where
showProblem :: ShoType (b -> c) => (b -> c) -> TypeString
showProblem = theType

对我来说,使用 OverlappingInstances 通常意味着我在代码中做出了错误的设计决策。

关于haskell - 重叠实例——不清楚 Haskell 选择了哪个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6585208/

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