Я застрял на этой ошибке довольно долгое время. Я не уверен, что я глуп, но я не могу понять, откуда это исходит...
Тип данных Settings
определяется так:
data Settings a = Settings {
_nodeDrawFunction :: a -> Diagram B
, _dynamicHead :: Measure Double
, _dynamicThick :: Measure Double
, _directed :: Directed
, _horizontalOrientation :: Maybe Bool
, _layerSpacing :: Maybe Double
, _nodeSpacing :: Maybe Double
, _graphPadding :: Maybe Double
, _colF :: Maybe (Int -> Colour Double)
, _bgOp :: Maybe Double
, _initPos :: Maybe Int
}
А makeLenses ''Settings
используется для создания линз для каждой записи. По умолчанию для _drawNodeFunction
используется drawDefaultNode
.
Когда я создаю функцию, перезаписывающую некоторые из этих значений, используя сеттеры Lens, она работает нормально, например:
test1 :: (Show a) => Graph a -> Settings a
test1 g = def & bgOp .~ Just 1
Что работает, как ожидалось. Тип Graph
взят из библиотеки алгебраических графов.
Если я попытаюсь установить nodeDrawFunction
, например, с помощью:
test2 :: (Show a) => Graph a -> Settings a
test2 g = def & nodeDrawFunction .~ drawDefaultNode
& bgOp .~ Just 1
Выдается следующая ошибка:
Could not deduce (Show a10) arising from a use of ‘def’
from the context: Show a
bound by the type signature for:
test2 :: forall a. Show a => Graph a -> Settings a
at Visualise/Hierarchical.hs:78:1-42
The type variable ‘a10’ is ambiguous
These potential instances exist:
instance Show n => Show (Duration n) -- Defined in ‘Data.Active’
instance Show n => Show (Era n) -- Defined in ‘Data.Active’
instance Show n => Show (Time n) -- Defined in ‘Data.Active’
...plus 74 others
...plus 264 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the first argument of ‘(&)’, namely ‘def’
In the first argument of ‘(&)’, namely
‘def & nodeDrawFunction .~ drawDefaultNode’
In the expression:
def & nodeDrawFunction .~ drawDefaultNode & bgOp .~ Just 1
Даже если я попытаюсь установить nodeDrawFunction
в значение по умолчанию (как и любую другую допустимую функцию).
Любая помощь будет высоко оценена, спасибо!