需要在两个单独的函数调用中等效的类型
Types required to be equivalent across two separate function calls
考虑 Haskell 中的以下两个函数(我的真实代码的最小示例):
printSequence :: (Show a, Show b) => a -> b -> IO ()
printSequence x y = (putStr . show) x >> (putStr . show) y
printSequence' :: (Show a, Show b) => a -> b -> IO ()
printSequence' x y = print' x >> print' y
where print' = putStr . show
第一个编译正常,但第二个产生错误:
Could not deduce (a ~ b)
from the context (Show a, Show b)
bound by the type signature for
printSequence' :: (Show a, Show b) => a -> b -> IO ()
at test.hs:8:19-53
`a' is a rigid type variable bound by
the type signature for
printSequence' :: (Show a, Show b) => a -> b -> IO ()
at test.hs:8:19
`b' is a rigid type variable bound by
the type signature for
printSequence' :: (Show a, Show b) => a -> b -> IO ()
at test.hs:8:19
In the first argument of print', namely `y'
In the second argument of `(>>)', namely `(print' y)'
In the expression: (print' x) >> (print' y)
我理解这个错误意味着 GHC 要求 x
和 y
是等效类型。我不明白的是为什么。像 print "fish" >> print 3.14
这样的语句在解释器中工作得很好,那么为什么当我两次调用 print'
函数时 GHC 抱怨 x
和 y
是不同的类型?
添加显式类型签名:
printSequence' :: (Show a, Show b) => a -> b -> IO ()
printSequence' x y = print' x >> print' y
where
print' :: Show a => a -> IO ()
print' = putStr . show
{-# LANGUAGE NoMonomorphismRestriction #-}
printSequence' :: (Show a, Show b) => a -> b -> IO ()
printSequence' x y = print' x >> print' y
where
print' = putStr . show
然后,
\> printSequence' 5 "five"
5"five"
考虑 Haskell 中的以下两个函数(我的真实代码的最小示例):
printSequence :: (Show a, Show b) => a -> b -> IO ()
printSequence x y = (putStr . show) x >> (putStr . show) y
printSequence' :: (Show a, Show b) => a -> b -> IO ()
printSequence' x y = print' x >> print' y
where print' = putStr . show
第一个编译正常,但第二个产生错误:
Could not deduce (a ~ b)
from the context (Show a, Show b)
bound by the type signature for
printSequence' :: (Show a, Show b) => a -> b -> IO ()
at test.hs:8:19-53
`a' is a rigid type variable bound by
the type signature for
printSequence' :: (Show a, Show b) => a -> b -> IO ()
at test.hs:8:19
`b' is a rigid type variable bound by
the type signature for
printSequence' :: (Show a, Show b) => a -> b -> IO ()
at test.hs:8:19
In the first argument of print', namely `y'
In the second argument of `(>>)', namely `(print' y)'
In the expression: (print' x) >> (print' y)
我理解这个错误意味着 GHC 要求 x
和 y
是等效类型。我不明白的是为什么。像 print "fish" >> print 3.14
这样的语句在解释器中工作得很好,那么为什么当我两次调用 print'
函数时 GHC 抱怨 x
和 y
是不同的类型?
添加显式类型签名:
printSequence' :: (Show a, Show b) => a -> b -> IO ()
printSequence' x y = print' x >> print' y
where
print' :: Show a => a -> IO ()
print' = putStr . show
{-# LANGUAGE NoMonomorphismRestriction #-}
printSequence' :: (Show a, Show b) => a -> b -> IO ()
printSequence' x y = print' x >> print' y
where
print' = putStr . show
然后,
\> printSequence' 5 "five"
5"five"