Haskell 与';要么';在哈斯克尔

Haskell 与';要么';在哈斯克尔,haskell,Haskell,我试图在Haskell中使用'other'来获得正确的值。这通常很容易做到,但我会出错,我不知道我做错了什么 我想做的是: cropImage image = do resized <- resizeImage copy newImage <- getImageFromEither resized ... 以及: 我觉得应该行得通。但我得到了这个错误: Couldn't match kind ‘*’ with ‘CV.DS *'

我试图在Haskell中使用'other'来获得正确的值。这通常很容易做到,但我会出错,我不知道我做错了什么

我想做的是:

 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我最好的猜测是你不小心返回了。@ChuckAguilar
IO()
左分支中,两个分支必须具有相同的类型。编译器抱怨第二个分支与第一个分支不匹配,而实际上是第一个分支
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
         ...