stopLoss函数导致以下错误:
Could not deduce (Text.Printf.PrintfType (m a0))
arising from the ambiguity check for `stopLoss'
from the context (Monad m,
Text.Printf.PrintfType (m b),
Text.Printf.PrintfType (m a))
bound by the inferred type for `stopLoss':
(Monad m, Text.Printf.PrintfType (m b),
Text.Printf.PrintfType (m a)) =>
Float -> Float -> Float -> m b
Possible fix:
add an instance declaration for (Text.Printf.PrintfType (m a0))
When checking that `stopLoss'
has the inferred type `forall (m :: * -> *) a b.
(Monad m, Text.Printf.PrintfType (m b),
Text.Printf.PrintfType (m a)) =>
Float -> Float -> Float -> m b'
Probable cause: the inferred type is ambiguous
Run Code Online (Sandbox Code Playgroud)
功能:
stopLoss qty pb lossRate = do
let t = qty * pb * (1 + sxf)
printf "Stop Loss at: %.2f\n" ((pb - (t * lossRate) / qty) :: Float)
printf "Lost Money: %.2f\n" ((t * lossRate) :: Float)
Run Code Online (Sandbox Code Playgroud)
任何建议表示赞赏!
类型printf是PrintfType r => String -> r.以下实例PrintfType可用:
IsChar c => PrintfType [c]
PrintfType (IO a)
(PrintfArg a, PrintfType r) => PrintfType (a -> r)
Run Code Online (Sandbox Code Playgroud)
(最后一个只是printf表现得像是多变量的.)
这stopLoss是一个多态函数; 该类型IO ()不能自动推断,GHC假设该函数适用于任何monad.因此,GHC抱怨PrintfType通用monad 的实例不存在.
提供类型签名Float -> Float -> Float -> IO ()应该有帮助.