Ключевое слово вопросительный знак в Haskell
Я пытаюсь создать оболочку для библиотеки C. и у него есть какой-то странный синтаксис с вопросительными знаками, которых я никогда раньше не видел:
cvLoadImage :: Capture -> IO CImage
cvLoadImage capture = do
(Just imageRGB) <- getFrame capture
let imageD32 = rgbToGray imageRGB
let (CArray (nx0, ny0) (nx1, ny1) numElem values) = copyImageToFCArray imageD32
pixelVals <- (withForeignPtr values) (peekArray numElem)
let pixelVals' = map (fromIntegral . truncate . (*255)) pixelVals
ptr <-( mallocArray (numElem) ::IO (Ptr Word8))
pokeArray ptr pixelVals'
return CImage (? ? ? pixelVals' ? ? ? ?) -- this is the line I'm confounded by
Это вызывает синтаксическую ошибку при компиляции:
src/System/FlyCap.hs:185:21: parse error on input ‘?’
Глядя вверх "?" в Google находит что-то о "неявных параметрах", но, похоже, это не связано. Я попытался заменить загадочные знаки вопроса на дыры типа:
return CImage (_ _ _ pixelVals' _ _ _ _)
Это дало мне гораздо большую ошибку:
src/System/FlyCap.hs:186:4:
Couldn't match type ‘IO CImage’
with ‘CUInt
-> CUInt
-> CUInt
-> Ptr CUChar
-> CUInt
-> CInt
-> CInt
-> Ptr ()
-> CImage’
Expected type: t6 -> IO CImage
Actual type: t6
-> CUInt
-> CUInt
-> CUInt
-> Ptr CUChar
-> CUInt
-> CInt
-> CInt
-> Ptr ()
-> CImage
The function ‘return’ is applied to two arguments,
but its type ‘(CUInt
-> CUInt
-> CUInt
-> Ptr CUChar
-> CUInt
-> CInt
-> CInt
-> Ptr ()
-> CImage)
-> t6
-> CUInt
-> CUInt
-> CUInt
-> Ptr CUChar
-> CUInt
-> CInt
-> CInt
-> Ptr ()
-> CImage’
has only 10
In a stmt of a 'do' block: return CImage (_ _ _ pixelVals' _ _ _ _)
In the expression:
do { (Just imageRGB) <- getFrame capture;
let imageD32 = rgbToGray imageRGB;
let (CArray (nx0, ny0) (nx1, ny1) numElem values)
= copyImageToFCArray imageD32;
pixelVals <- (withForeignPtr values) (peekArray numElem);
.... }
Я действительно не уверен, как поступить. Какие-нибудь советы?
ОБНОВЛЕНИЕ: я нашел оригинальный репо, который, кажется, исправил это, но я все еще задаюсь вопросом, что такое вопросительные знаки?
1 ответ
?
это не синтаксис, это допустимый оператор в haskell. Но здесь это просто "какая-то магия здесь".
Авторы, как отмечено выше, просто забыли заменить его на какое-то выражение, включающее pixelVals'
, Скорее всего, это должно быть строительство CImage
параметр (ы?) из значений этого пикселя.
Парсер GHC даст parse error
на любых двух последовательных токенах, сделанных из символов оператора (кроме -
) - из-за этого не получилось после второго знака вопроса.