gpt4 book ai didi

haskell - 当类型是自由变量时,实例内部类型签名中的类型类约束

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

当类型是 Haskell 中的自由变量时,如何在实例内部的类型签名中添加类型类约束。例如:

{-# LANGUAGE InstanceSigs #-}

class Pair a where
pair :: a -> b -> (a, b)

instance Pair Int where
pair :: (Show a) => a -> b -> (a, b)
pair a b = (a, b)

有效,“a”是一个绑定(bind)类型变量,而:

{-# LANGUAGE InstanceSigs #-}

class Pair a where
pair :: a -> b -> (a, b)

instance Pair Int where
pair :: (Show b) => a -> b -> (a, b)
pair a b = (a, b)

给出了这个错误:

source_file.hs:8:13:
No instance for (Show b)
Possible fix:
add (Show b) to the context of
the type signature for pair :: Int -> b -> (Int, b)
When checking that: forall a b. Show b => a -> b -> (a, b)
is more polymorphic than: forall b. Int -> b -> (Int, b)
When checking that instance signature for ‘pair’
is more general than its signature in the class
Instance sig: forall a b. Show b => a -> b -> (a, b)
Class sig: forall b. Int -> b -> (Int, b)
In the instance declaration for ‘Pair Int’

最佳答案

在概念直观的层面上,类 Pair 是对消费者的 promise 。它说“有一个函数pair,它将适用于此类型a和任何其他类型b”。任何看到该类的人都可以使用任何类型 b 的函数。

但是你的实例试图说“我将实现这个函数pair,但仅限于具有Show实例的b” ”。好吧,这不是该类的完整实现:​​该类 promise 适用于任何 b,但该实例仅适用于some b s。

关于haskell - 当类型是自由变量时,实例内部类型签名中的类型类约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47296404/

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