Ошибка при доступе к определенному ADT

Я определяю тип, и все работает нормально, кроме метода, который обращается к последнему конструктору данных: JArray

Я получаю следующую ошибку:

Not in scope: type constructor or class `JArray'
    A data constructor of that name is in scope; did you mean DataKinds?

   |
28 |     getArray::JValue->Maybe JArray
   |  

Почему это происходит? Я могу загрузить модуль и создать экземпляр JArray, но он не загружается с помощью метода getArray.

data JValue = JString String
            | JNumber Double
            | JBool Bool
            | JNull
            | JObject [(String, JValue)]
            | JArray [JValue]
            deriving (Eq, Ord, Show)

getString :: JValue -> Maybe String
getString (JString s) = Just s
getString _ = Nothing

getInt :: JValue -> Maybe Int
getInt (JNumber n) = Just (truncate n)
getInt _ = Nothing

getBool :: JValue -> Maybe Bool
getBool (JBool b) = Just b
getBool _ = Nothing

getObject (JObject obj) = Just obj
getObject _ = Nothing

--What is wrong in this method?

getArray :: JValue -> Maybe JArray    
getArray (JArray arr) = Just arr
getArray _ = Nothing

person Bercovici Adrian    schedule 19.05.2018    source источник
comment
JArray - это не тип, это конструктор. Что вы пытаетесь сделать здесь? Вы хотели написать getArray :: JValue -> Maybe [JValue]? Это тип функции здесь.   -  person AJF    schedule 19.05.2018


Ответы (1)


JArray – это конструктор значений, а не тип. Вы не можете использовать JArray в подписях типов.* Это фактически объясняется ошибкой: Not in scope: type constructor or class `JArray'.

Так как мы видим это:

data JValue = JString String
            | JNumber Double
            | JBool Bool
            | JNull
            | JObject [(String,JValue)]
            | JArray [JValue]           -- This line defines JArray

Итак, JArray :: [JValue] -> JValue. Глядя на вашу функцию, но игнорируя ошибочную подпись типа:

getArray (JArray arr) = Just arr
-- ^ arr :: [JValue], so Just arr :: Maybe [JValue]
getArray _ = Nothing
-- ^ Nothing :: Maybe a

Итак, поскольку вы выполняете сопоставление с образцом для некоторого JValue, функция имеет тип getArray :: JValue -> Maybe [JValue]. Это потому, что типы и обитатели этого типа различны.


* за исключением DataKinds, но это отдельная проблема.

person AJF    schedule 19.05.2018