Ошибка при доступе к определенному ADT - PullRequest
0 голосов
/ 19 мая 2018

Я определяю тип, и все работает нормально, кроме метода, который обращается к последнему конструктору данных: 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

1 Ответ

0 голосов
/ 19 мая 2018

JArray является конструктором значения, а не типом.Вы не можете использовать JArray в сигнатурах типов. * Это на самом деле объясняется в ошибке: Not in scope: <strong>type constructor</strong> or <strong>class</strong> `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, но это отдельная проблема.

...