Ключевое слово вопросительный знак в 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 на любых двух последовательных токенах, сделанных из символов оператора (кроме -) - из-за этого не получилось после второго знака вопроса.

Другие вопросы по тегам