2016-02-26 2 views
0

У меня есть ошибка в этом коде в Привязать Haskell приложения:Не в области видимости: 'грабеж' (я не использую Lens)

import Snap.Http.Server 
import Snap.Core 
import Snap.Snaplet 
import Snap.Snaplet.Heist 
import Snap.Util.FileServe 
import Snap.Util.GZip 
import Heist.Interpreted 
import Heist 

data App = App { appHeist :: Snaplet (Heist App) } 

routes :: [(ByteString, Handler App App())] 
routes = [("", serveDirectory "static")] 

appInit :: SnapletInit App App 
appInit = makeSnaplet "app" "An snaplet example application." Nothing $ do 
    h <- nestSnaplet "" heist $ heistInit "templates" 
    addRoutes routes 
    return $ App h 

Ошибка является:

Not in scope: ‘heist’ 

и I не может найти в каком пакете функцию «heist».

Обратите внимание, что я не использую объектив и не хочу. Есть ли способ не использовать их и скомпилировать мой код?

+2

Я не знаком с Snap или Heist (?), Но [Snap уже зависит от объектива] (http://hackage.haskell.org/package/snap-0.14.0.6). Если вы используете Snap, вы используете «объектив» - нет никакого способа обойти это, кроме как разветвить библиотеку и изменить ее, чтобы не использовать «объектив». Кроме того, в то время как многие типы «объективов» являются просто синонимами типа (поэтому вам не нужно использовать «объектив» для использования объективов), «SnapletLens» содержит конкретный тип из «объектива», то есть вам действительно нужно использовать объектив здесь. – user2407038

ответ

1

Я не знаком с Snap, но, судя по типу подписи nestSnaplet, похоже, вам понадобится использовать какой-то объектив. nestSnaplet имеет сигнатуру

nestSnaplet :: ByteString -> SnapletLens v v1 -> SnapletInit b v1-> Initializer b v (Snaplet v1) 

где SnapletLens просто тип синоним для Alens из lens.

Это также заставляет меня подозревать, что heist был изначально полученной функцией Шаблон Haskell, выполненной с использованием lens. Возможно, что произошло то, что App используется выглядеть следующим образом:

-- You may need to import Contol.Lens.TH 
data App = App { _heist :: Snaplet (Heist App) } 
makeLenses ''App 

, который сделал бы heist объектив.

+1

Обратите внимание, что любой 'Lens' может функционировать как' ALens'. – dfeuer

+0

здесь нет объектива "https://github.com/cakesolutions/the-pragmatic-haskeller/blob/e1251bfd8ec00d88fd817527db3ed7ad03e14fa6/07-forms/src/Pragmatic/Server/Site.hs" –

+0

Он импортируется с помощью 'import Pragmatic.Server .Приложение. Если вы перейдете к этому файлу (https://github.com/cakesolutions/the-pragmatic-haskeller/blob/e1251bfd8ec00d88fd817527db3ed7ad03e14fa6/07-forms/src/Pragmatic/Server/Application.hs), вы увидите точно тот же шаблон 'data Pragmatic = {_heist :: Snaplet (приложение Heist) ...}', за которым следует 'makeLenses '' Pragmatic' – badcook

Смежные вопросы