Я пытаюсь использовать «Либо» в Haskell, чтобы получить справа значение. Обычно это легко сделать, но я получаю сообщение об ошибке, и я не знаю, что я делаю неправильно.Смуты с «Либо» в haskell
То, что я хочу сделать это:
cropImage image = do
resized <- resizeImage copy
newImage <- getImageFromEither resized
...
где resized
определяется как:
resized :: Either CV.CvException (M.Mat ('CV.S '['CV.D, 'CV.D]) channels depth)
И я хочу, чтобы получить M.Mat ('CV.S '['CV.D, 'CV.D]) channels depth
, чтобы сделать это, я использую эта функция:
getImageFromEither eitherImage = fromRight eitherImage
и:
fromRight :: Either a b -> b
fromRight (Left _) = error "fromRight: Argument takes form 'Left _'"
fromRight (Right x) = x
И я подумал, что это должно работать. Но я получаю эту ошибку:
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
У меня нет идеи, что не так. Я вижу код правильно, но я слеп с ошибкой.
Если 'resized' имеет тип' Либо CV.CvException (M.Mat ('CV.S' ['CV.D,' CV.D]) 'вы говорите, что' resizeImage' возвращает 'Either 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.D])' – Lee
@Lee Спасибо за ваш ответ. 'ResizeImage' возвращает' либо CV.CvException (M.Mat ('CV.S' ['CV.D,' CV.D]). Но, как вы можете видеть в сообщении об ошибке , resized является «Либо CV.CvException (M.Mat (« CV.S »['CV.D,' CV.D])' Не так ли? –
Если у вас есть выражение 'x' типа' Либо ea', то внутри 'do' нотации, в' v <- x', 'v' имеет тип' a'. Таким образом, это означает, что 'resized' имеет тип' M.Mat ('CV.S' ['CV.D, 'CV.D] ', и вам не нужно использовать' getImageFromEither'. Работает ли он, если вы используете 'newImage <- resizeImage copy'? – Lee