Haskell 与';要么';在哈斯克尔
我试图在Haskell中使用'other'来获得正确的值。这通常很容易做到,但我会出错,我不知道我做错了什么 我想做的是:Haskell 与';要么';在哈斯克尔,haskell,Haskell,我试图在Haskell中使用'other'来获得正确的值。这通常很容易做到,但我会出错,我不知道我做错了什么 我想做的是: cropImage image = do resized <- resizeImage copy newImage <- getImageFromEither resized ... 以及: 我觉得应该行得通。但我得到了这个错误: Couldn't match kind ‘*’ with ‘CV.DS *'
cropImage image = do
resized <- resizeImage copy
newImage <- getImageFromEither resized
...
以及:
我觉得应该行得通。但我得到了这个错误:
Couldn't match kind ‘*’ with ‘CV.DS *'
When matching types
m :: * -> *
M.Mat ('CV.S '['CV.D, 'CV.D]) channels :: CV.DS * -> *
Expected type: Either CV.CvException (m t0)
Actual type: Either
CV.CvException (M.Mat ('CV.S '['CV.D, 'CV.D]) channels depth)
Relevant bindings include
resized :: Either
CV.CvException (M.Mat ('CV.S '['CV.D, 'CV.D]) channels depth)
(bound at src/CropImage.hs:25:9)
copy :: M.Mat ('CV.S '[height, width]) channels depth
(bound at src/CropImage.hs:32:17)
image :: M.Mat ('CV.S '[height, width]) channels depth
(bound at src/CropImage.hs:24:11)
cropImage :: M.Mat ('CV.S '[height, width]) channels depth
-> m (Either
CV.CvException (M.Mat ('CV.S '['CV.D, 'CV.D]) channels depth))
(bound at src/CropImage.hs:24:1)
In the first argument of ‘getImageFromEither’, namely ‘resized’
In a stmt of a 'do' block: newImage <- getImageFromEither resized
无法将种类“*”与“CV.DS*”匹配
匹配类型时
m::*->*
M.Mat('CV.S'['CV.D',CV.D])频道::CV.DS*->*
预期类型:CV.CvException(m t0)
实际类型:或
CV.CvException(M.Mat('CV.S'['CV.D',CV.D])通道深度)
相关绑定包括
调整大小::或者
CV.CvException(M.Mat('CV.S'['CV.D',CV.D])通道深度)
(在src/CropImage.hs:25:9处装订)
副本::M.Mat('CV.S'[高度、宽度])通道深度
(在src/CropImage.hs:32:17处装订)
图像::M.Mat('CV.S'[高度、宽度])通道深度
(在src/CropImage.hs:24:11绑定)
cropImage::M.Mat('CV.S'[高度、宽度])通道深度
->m(或者
CV.CvException(M.Mat('CV.S'['CV.D',CV.D])通道深度)
(在src/CropImage.hs:24:1处装订)
在'GetImageFromOrther'的第一个参数中,即'resized'
在“do”块的stmt中:newImage您可能需要
cropImage image = do
resized <- resizeImage copy
let newImage = getImageFromEither resized
...
这还允许您更优雅地处理错误,例如向用户报告错误。使用error
或类似于getimagefrom
的部分函数通常被认为不是好的风格。通过崩溃处理错误在短期内很方便,但最终您可能希望正确处理该错误。您可能希望
cropImage image = do
resized <- resizeImage copy
let newImage = getImageFromEither resized
...
这还允许您更优雅地处理错误,例如向用户报告错误。使用error
或类似于getimagefrom
的部分函数通常被认为不是好的风格。通过崩溃处理错误在短期内很方便,但最终您可能希望错误得到正确处理。如果调整大小的具有类型或CV.CvException(M.Mat('CV.S'['CV.D',CV.D])
您说的resizeImage
返回或e(或CV.CvException(M.Mat('CV.S'['CV.D',CV.D])))
?或者resizeImage
是否返回任何一个CV.CvException(M.Mat('CV.S'['CV.D',CV.D])
?在这种情况下resized
是(M.Mat('CV.S'['CV.D',CV CV D])
@Lee感谢您的回答。resizeImage
返回任何一个CV exception(M.Mat CV S'['CV D',CV CV D])
。但是,正如您在错误消息中看到的,resized是一个或CV.CV异常(M.Mat('CV.S'['CV.D',CV.D])
不是吗?如果你有一个类型为ea
的表达式x
,那么在do
符号中,在v@Lee Nope中,我得到了这个错误无法将预期的类型“M.Mat shape0 channels0 depth0”与实际类型“ather CV.CvException”(M.Mat('CV.S'['CV.D',CV.D])channels depth)匹配“
。这意味着调整大小的不是M.Mat('CV.S'['CV.D',CV.D])通道深度
:(@Lee但如果我这样做:大小写为左cvError->print(“nope”)Right image->do putStrLn(show(gethandwimage))
。它可以工作,但我需要在函数中使用它来获取image
(getHanW返回图像形状,这只是一个示例。)如果大小调整后的具有类型或CV.CvException(M.Mat('CV.S'['CV.D',CV.D])
您说的是大小调整图像返回或e(或CV.CvException(M.Mat('CV.S'['CV.D',CV.D]))
?或者resizeImage
是否返回任何一个CV.CvException(M.Mat('CV.S'['CV.D',CV.D])
?在这种情况下resized
是(M.Mat('CV.S'['CV.D',CV CV D])
@Lee感谢您的回答。resizeImage
返回任何一个CV exception(M.Mat CV S'['CV D',CV CV D])
。但是,正如您在错误消息中看到的,resized是一个或CV.CV异常(M.Mat('CV.S'['CV.D',CV.D])
不是吗?如果你有一个类型为ea
的表达式x
,那么在do
符号中,在v@Lee Nope中,我得到了这个错误无法将预期的类型“M.Mat shape0 channels0 depth0”与实际类型“ather CV.CvException”(M.Mat('CV.S'['CV.D',CV.D])channels depth)匹配“
。这意味着调整大小的不是M.Mat('CV.S'['CV.D',CV.D])通道深度
:(@Lee但如果我这样做:大小写为左cvError->print(“nope”)Right image->do putStrLn(show(gethandwimage))
。它可以工作,但我需要在函数中使用它来获取image
(getHanW返回图像形状,这只是一个示例。)谢谢!它工作得很好。只是一件事。我想使用第二种方法,但它不适用于我,因为我需要在某个时间返回新图像。当我编写Right newImage->do
然后return newImage
时,它说无法匹配预期的类型'IO()'使用实际类型'M.Mat('CV.S'['CV.D',CV.D])通道深度'
那么,我如何返回新图像?返回新图像
看起来是正确的……您确定您声明了cropImage
以返回IO(M.Mat…
而不是IO()
?我想知道为什么预期的类型是IO()
根据错误,我可以返回newImage
如果我写让newImage=…
但是如果我写在…的案例中,我就不能返回它。
我不知道为什么。你能把你的新代码片段发布到某个地方吗?很难说别的。@ChuckAguilar我最好的猜测是你不小心返回了。@ChuckAguilarIO()
在左分支中,两个分支必须具有相同的类型。编译器抱怨第二个分支与第一个分支不匹配,而实际上是第一个分支
cropImage image = do
resized <- resizeImage copy
let newImage = getImageFromEither resized
...
cropImage image = do
resized <- resizeImage copy
case resized of
Left err -> error ("resize failed: " ++ show err)
Right newImage -> do
...