Две мысли (дикие догадки?) Выглядит так, как будто не удается создать правильную сигнатуру типа в предложении Just obj
и / или из readObj name
, и может быть интересно попробовать что-то вроде этого:
loader' :: [(String, ObjType)] -> String -> (ObjType, String -> ObjType)
loader' objs name = case findObj objs name of
Nothing → (new_obj, loader' new_objs) where
new_objs = [(name, new_obj)] ++ objs
new_obj = readObj name
Just obj → (obj, loader' objs)
loader = loader' []
Я не говорю, что это исправит (но я полагаю, что это может); скорее я говорю, что это может превратить проблему в проблему, которая имеет больше смысла, или иным образом пролить свет на ситуацию.
Edit:
Применение предложенного Томом Локхорстом названия типа кэша приводит нас к следующему:
type Cache = [(String, ObjType)]
loader' :: Cache -> String -> (ObjType, ????)
loader' objs name = case findObj objs name of
Nothing → (new_obj, loader' new_objs) where
new_objs = [(name, new_obj)] ++ objs
new_obj = readObj name
Just obj → (obj, loader' objs)
loader = loader' []
что делает очевидным, в чем проблема. Тип второго результата loader '- это функция, которая принимает строку, и создает пару, состоящую из ObjType, и функцию, которая принимает строку, и создает пару, состоящую из ObjType, и функция, которая принимает строку, и создает пару. состоящий из ObjType и функции, которая принимает строку и создает пару, состоящую из ObjType и ... вы получите картинку.
Если переписать это так:
type Cache = [(String, ObjType)]
loader' :: Cache -> String -> (ObjType, Cache)
loader' objs name = case findObj objs name of
Nothing → (new_obj, new_objs) where
new_objs = [(name, new_obj)] ++ objs
new_obj = readObj name
Just obj → (obj, objs)
он должен скомпилироваться, но вам придется изменить способ его использования.