我正在尝试编译以下代码
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/