OverloadedLabels: нет экземпляра для IsLabel для типа данных записи. - PullRequest
4 голосов
/ 16 марта 2020

В приведенном ниже коде,

{-# LANGUAGE OverloadedLabels #-}
module Foo where

data R = R { x :: Int }

g :: Int
g = #x (R { x = 1 })

Я ожидал, что это проверка типа, но вместо этого я получаю:

foo.hs:7:5: error:
    • No instance for (GHC.OverloadedLabels.IsLabel "x" (R -> Int))
        arising from the overloaded label ‘#x’
        (maybe you haven't applied a function to enough arguments?)
    • In the expression: #x
      In the expression: #x (R {x = 1})
      In an equation for ‘g’: g = #x (R {x = 1})

Учитывая перегруженные поля записи предложение, я ожидал, что будет встроенный экземпляр IsLabel "x" (R -> Int). Это все еще так или же реализация отклоняется от предложения?

1 Ответ

3 голосов
/ 16 марта 2020

Нет экземпляра IsLabel для OverloadedLabels в (по крайней мере, текущей) базе (см. Обсуждение здесь ). Вы можете использовать некоторые библиотеки, которые определяют экземпляр-сироту, например generi c -lens . Конечно, вы можете определить это самостоятельно:

{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}

import GHC.Records
import GHC.OverloadedLabels

instance HasField x r a => IsLabel x (r -> a) where
  fromLabel = getField @x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...