Это действительно вопрос новичка, но я не могу найти что-либо об этом в Интернете или в stackoverflow. Может быть, я просто неправильно искал ..
У меня есть приложение yesod, где все в одном файле, и я не могу понять, как переместить функции в отдельные файлы. Вот минимальный пример:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Main where
import Yesod
data App = App
mkYesod "App" [parseRoutes|
/ HomeR GET
|]
instance Yesod App
getHomeR = defaultLayout $ toWidget [hamlet|Hello Stackoverflow|]
main = warp 8080 App
Как переместить функцию getHomeR
в отдельный файл? В getHomeR
мне нужен доступ к App
, но mkYesod "App"
нужен доступ к getHomeR
. Это похоже на циклическую зависимость. Но каким-то образом должна быть возможность создавать приложения yesod, состоящие из нескольких исходных файлов.
Что я могу сделать - это перенести функциональность, которая не зависит от App
, в отдельные файлы. Но когда App
растет и содержит все больше и больше функций, это становится неудобным, поскольку все функции обработчика верхнего уровня по-прежнему должны находиться в одном файле. И я не хочу использовать шаблон yesod, потому что я не понимаю, что он делает.
для решения предлагаемого решения из комментариев:
Вы можете определить функции в отдельных файлах и импортировать их в Main. Это примерно так и делается в шаблоне стека yesod-mysql.
сообщение об ошибке: «Нет экземпляра для (Yesod site0), возникающего из-за использования defaultLayout».
И когда я import Main
в GetHomeR.hs, сообщение об ошибке становится «Переменная типа неопределенности site0' arising from a use of
defaultLayout '».
И когда я добавляю getHomeR :: Handler Html
, он на мгновение компилируется, но: теперь мне нужно import GetHomeR
из Main.hs. И GHC жалуется с предупреждением о циклической зависимости:
Module imports form a cycle:
module `Main' (app\Main.hs)
imports `GetHomeR' (app\GetHomeR.hs)
which imports `Main' (app\Main.hs)
это не правильно. Это правильный способ сделать это?