haskell - 推导多参数类型类的类型

标签 haskell types typeclass

我正在尝试编译以下代码

import IO

data MyInt = MyInt Int
data MyString = MyString String deriving Show

class Show b => MyClass a b where
    fn :: a -> b

instance MyClass MyInt MyString where
    fn (MyInt i) = MyString (show i)

myprint :: (MyClass a b) => a -> IO () 
myprint a = putStrLn $ show (fn a)

main = myprint (MyInt 3)

使用 ghc Main.hs -XMultiParamTypeClasses。但是,编译器无法推断出 b 类型变量的类型(在本例中为 MyString)。我如何才能明确地将此信息告知编译器?

最佳答案

您违反了“开放世界”假设。在这种情况下,范围内只有一个实例可以满足类型约束;但这不是一种非常明确的方式来指定 myprint 3 的含义,对吗?鉴于实例实际上可以从任何模块中 float ,我们可以看到开放世界假设如何保护您在添加或更新模块时免受类型/行为的意外更改。

在这种情况下,您可以尝试函数依赖或类型族。

class Show b => MyClass a b | a -> b where
  ...

关于haskell - 推导多参数类型类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3252798/

相关文章:

windows - 具有 NoBuffering 的 Haskell 跨平台 getChar

haskell - Haskell 中展开器类型的理由是什么?

haskell - 这两个实例如何重叠(涉及超出范围的类型)

haskell - Reify 存在实例类型参数

haskell - 此功能的正确签名是什么?

haskell - 访问 Haskell 函数中的命名字段

c - 纯 C : opening a directory with fopen()

haskell - Haskell 中类型和数据类型有什么区别?

haskell - 这个 ghci session 中的类型是怎么回事?

go - 关于 Go 中的接口(interface)类型是什么类型有官方说法吗?