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).如何将此信息明确告知编译器?
你已经违背了"开放世界"的假设.在这种情况下,范围中只有一个实例可以满足类型约束; 但这不是一个非常具有声明性的方式来指定其含义myprint 3,是吗?鉴于实例可以从任何模块中真正浮动,我们可以看到开放世界假设如何在模块添加或更新时保护您免受类型/行为的意外更改.
在这种情况下,您可以尝试函数依赖项或键入族.
class Show b => MyClass a b | a -> b where
...
Run Code Online (Sandbox Code Playgroud)