gpt4 book ai didi

Haskell Constraint Kinds - 默认实现的默认约束

转载 作者:行者123 更新时间:2023-12-02 20:48:29 28 4
gpt4 key购买 nike

标题:我想为通过约束参数化的类方法提供默认实现,该实现使用该约束的默认实例。

考虑以下因素:

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}

import GHC.Exts (Constraint)

class Foo a where
type Ctx a :: Constraint
type Ctx a = Show a

foo :: (Ctx a) => a -> String
foo = show

main :: IO ()
main = putStrLn "Compiles!"

编译失败,错误如下:

Could not deduce (Show a) arising from a use of ‘show’
from the context (Foo a)

从我的角度来看,它应该使用 Show 的默认约束,这将让其编译。有什么原因这行不通吗?或者有人可以提出一个实现这一目标的好方法吗?

最佳答案

您可以使用DefaultSignatures来实现此目的:

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DefaultSignatures #-}

import GHC.Exts (Constraint)

class Foo a where
type Ctx a :: Constraint
type Ctx a = Show a

foo :: (Ctx a) => a -> String

default foo :: Show a => a -> String
foo = show

main :: IO ()
main = putStrLn "Compiles!"

From my perspective, it should be using the default constraint of Show, which would let this compile.

您的方法不起作用的原因是您的类(class)的用户应该能够覆盖任意数量的默认值。如果有人尝试覆盖 Ctx 但不覆盖 foo,您的代码就会中断。

关于Haskell Constraint Kinds - 默认实现的默认约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24997594/

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