推导出多参数类型的类型

Ale*_*lex 2 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)
Run Code Online (Sandbox Code Playgroud)

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

sol*_*ack 5

你已经违背了"开放世界"的假设.在这种情况下,范围中只有一个实例可以满足类型约束; 但这不是一个非常具有声明性的方式来指定其含义myprint 3,是吗?鉴于实例可以从任何模块中真正浮动,我们可以看到开放世界假设如何在模块添加或更新时保护您免受类型/行为的意外更改.

在这种情况下,您可以尝试函数依赖项或键入族.

class Show b => MyClass a b | a -> b where
  ...
Run Code Online (Sandbox Code Playgroud)