Откуда приходит «[] и где он объявлен? [Дубликат]

Я думаю, проблема в том, что вы создаете новое соединение в функции, а затем не закрываете ее в конце. Почему бы вам не попробовать перейти к существующему соединению и повторно использовать его?

Другая возможность заключается в том, что вы возвращаетесь из середины цикла. Вы никогда не завершаете эту внешнюю выборку.

6
задан Marcelo Lazaroni 1 July 2017 в 20:08
поделиться

2 ответа

Это DataKinds в действии, которое:

  • поднимает значения на уровне уровня, а
  • поднимает типы до уровня уровня

Это, однако, вызывает путаницу на уровне типа. Теперь в типах [X] может быть либо [X] :: *, либо тип списка X, либо вместо этого мы могли бы иметь [X] :: [T] из-за подъема - это значение [X] (только список, содержащий только единственное значение X) с X типа T, поднятое на уровне уровня.

Чтобы преодолеть эту двусмысленность, GHC требует цитаты перед конструкторами с поднятыми значениями. Итак, у нас есть [X] :: * и '[X] :: [T].

Конкретно, в вашем случае Get '[JSON] [User] включает как значение списка [JSON], поднятое до уровня типа, так и тип списка [User] , Чтобы лучше понять разницу, обратите внимание, что терминов типа '[JSON] нет, поскольку это не тип списка. Мы могли бы даже иметь Get '[JSON,JSON,JSON] [User] как хорошо выраженное выражение или даже Get '[] [User]. Вместо этого мы не можем иметь Get '[JSON] [User,User], так как [User,User] не является типом.

(Тип Get '[JSON,JSON,JSON] [User], даже если он действителен, не может быть осмысленно использован библиотекой Servant. не знаю, для чего этот поднятый список используется в Слуге.)

5
ответ дан chi 15 August 2018 в 14:46
поделиться
  • 1
    (Полезно)? '[JSON] не является типом вообще, не должно быть никаких условий этого «типа». – luqui 12 August 2018 в 07:18
  • 2
    @luqui Правильно. Я, наверное, думал о нижних частях, которые здесь не применяются. Исправлена. – chi 12 August 2018 в 08:51

Котировки используются для различения конструкторов типового типа по сравнению с конструкторами уровня уровня продвигаемых типов.

Например:

{-# LANGUAGE DataKinds #-}

data Which = One | Two

myPick :: Which -- Type
myPick = One

type MyPick :: Which -- Kind
type MyPick = 'One

Кстати, аннотация вида вида type MyPick :: Which недействителен Haskell, но он дает вам представление о соответствии между термином и уровнем типа. Самое близкое, что вам нужно для этого, необходимо включить другое расширение:

{-# LANGUAGE TypeFamilies #-}

type family MyPick :: Which where
  MyPick = 'One
7
ответ дан gallais 15 August 2018 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: