gpt4 book ai didi

haskell - 类型约束 : Can they be inferred from the datatype of a function's arguments?

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

这个

newtype ( Show a , Show b , Show c ) => T a b c = T Int
t :: T a b c -> a -> b -> c -> String
t ( T x ) a b c = show a ++ show b ++ show c

给我一个错误:
No instance for (Show c)
arising from a use of `show'
In the second argument of `(++)', namely `show c'
In the second argument of `(++)', namely `show b ++ show c'
In the expression: show a ++ show b ++ show c

但是这个
newtype ( Show a , Show b , Show c ) => T a b c = T Int
t :: ( Show a , Show b , Show c ) => T a b c -> a -> b -> c -> String
t ( T x ) a b c = show a ++ show b ++ show c

编译。

为什么?

在第一种情况下,“T a b c”不是已经暗示“(Show a , Show b , Show c )”吗?为什么需要明确指定约束?

最佳答案

不,在数据(新类型)定义上放置上下文从未完全符合人们的预期。它仅在构造值时更改构造函数的类型,在模式匹配时不会发生任何新情况。这是一个基本无用的功能,并且已在最新版本的 Haskell 中删除。

您的期望是相当合理的,但这不是数据类型上下文所做的。

关于haskell - 类型约束 : Can they be inferred from the datatype of a function's arguments?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6573580/

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