Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Yesod (web framework)

From Wikipedia, the free encyclopedia
This article has multiple issues. Please helpimprove it or discuss these issues on thetalk page.(Learn how and when to remove these messages)
icon
This articlerelies excessively onreferences toprimary sources. Please improve this article by addingsecondary or tertiary sources.
Find sources: "Yesod" web framework – news ·newspapers ·books ·scholar ·JSTOR
(September 2018) (Learn how and when to remove this message)
This articlecontainsinstructions or advice. Wikipedia is not a guidebook; please helprewrite such content to be encyclopedic or move it toWikiversity,Wikibooks, orWikivoyage.(September 2018)
(Learn how and when to remove this message)
Yesod
Original authorMichael Snoyman
DevelopersMichael Snoyman, et al.
Initial release2010; 16 years ago (2010)
Stable release
1.6.24.5[1] Edit this on Wikidata / 14 September 2023; 2 years ago (14 September 2023)
Written inHaskell
Operating systemCross-platform
Available inEnglish
TypeWeb framework
LicenseMIT
Websitewww.yesodweb.comEdit this at Wikidata
Repository

Yesod (Hebrew pronunciation:[jeˈsod];Hebrew:יְסוֺד, "Foundation") is aweb framework based on theprogramming languageHaskell for productive development of type-safe, representational state transfer (REST) model based (where uniform resource locators (URLs) identify resources, andHypertext Transfer Protocol (HTTP) methods identify transitions), high performance web applications, developed by Michael Snoyman, et al. It isfree and open-source software released under anMIT License.

Yesod is based on templates, to generate instances for listed entities, and dynamic content process functions, throughTemplate Haskell constructs to hostdomain-specific language (eDSL) content templates called QuasiQuotes, where the content is translated into code expressions bymetaprogramming instructions.[2]

There are also web-like languagesnippet templates that admit code expression interpolations, making them fully type-checked atcompile time.[3]

Yesod divides its functions in separatelibraries (database, html rendering, forms, etc.) so functions may used as needed.

MVC architecture

[edit]

Yesod uses themodel–view–controller (MVC)software design pattern for itsuser interfaces.

Controller

[edit]

Server interface

[edit]

Yesod uses aWeb application interface (WAI),[4] a type ofapplication programming interface (API), to isolateservlets,aka web apps., from servers, with handlers for the server protocolsCommon Gateway Interface (CGI),[5]FastCGI,[6]Simple Common Gateway Interface (SCGI),[7] Warp,[8]Launch (open as localURL to the default browser, closing the server when the window is closed),[9]

Thefoundation type

[edit]

See ref.[10] Yesod requires a data type that instantiates themodel–view–controller classes. This is called thefoundation type. In the example below, it is named "MyApp".

TheREST model identifies a web resource with a web path. Here, REST resources are given names with an R suffix (like "HomeR") and are listed in aparseRoutes site map description template. From this list, route names and dispatch handler names are derived.

Yesod makes use ofTemplate Haskell metaprogramming to generate code from templates at compile time, assuring that the names in the templates match and everything typechecks (e.g. web resource names and handler names).

By inserting amkYesod call, this will callTemplate Haskell primitives to generate the code[11] corresponding to the route type members, and the instances of the dispatch controller classes as to dispatchGET calls to routeHomeR to a routine named composing them both as "getHomeR", expecting an existing handler that matches the name.

Hello World

[edit]

"Hello, World!" program example based on aCommon Gateway Interface (CGI) server interface (the handler types have changed, but the philosophy remains):

{- file wai-cgi-hello.hs -}{-# LANGUAGE PackageImports, TypeFamilies, QuasiQuotes, MultiParamTypeClasses,             TemplateHaskell, OverloadedStrings #-}import"wai"Network.Waiimport"wai-extra"Network.Wai.Handler.CGI(run)-- interchangeable WAI handlerimport"yesod"Yesodimport"yesod-core"Yesod.Handler(getRequest)import"text"Data.Text(Text)import"shakespeare"Text.Cassius(Color(..),colorBlack)-- the Foundation typedataMyApp=MyApp-- sitemap template, listing path, resource name and methods accepted-- `mkYesod` takes the foundation type name as param. for name composition of dispatch functionsmkYesod"MyApp"[parseRoutes|/HomeRGET|]instanceYesodMyApp-- indentation structured CSS templatemyStyle::[Text]CssUrlurlmyStyleparamStyle=[cassius|.boxborder:1pxsolid#{boxColor}|]whereboxColor=caseparamStyleof["high-contrast"]colorBlack_Color00255-- indentation structured HTML templatemyHtml::[(Text,Text)]HtmlUrlurlmyHtmlparams=[hamlet|
<!-- indentation, or lack of it, under starting tags or commands ('$' prefix)     describe the content or sequence tree structure --><!-- '.' or '#' prefixes in tags introduce css styled "class" or "id" attribute values --><!-- interpolation of haskell expressions follow the "shakespeare templates"#{expr} syntax --><p>Hello World! There are<span.box>#{length params} parameters</span>:$if null params<p>Nothing to list$else<ul>$forall param<-params<li>#{fst param}:#{snd param}|]
getHomeR::HandlerRepHtmlgetHomeR=doreq<-getRequestletparams=reqGetParamsreqparamStyle<-lookupGetParams"style"defaultLayout$do-- adding widgets to the Widget monad (a ''Writer'' monad)setTitle"Yesod example"toWidgetHead$myStyleparamStyletoWidgetBody$myHtmlparams-- there are ''run'' function variants for different WAI handlersmain=toWaiAppMyApp>>=run
# cgi testexportREMOTE_ADDR=127.0.0.1exportREQUEST_METHOD=GETexportPATH_INFO=/exportQUERY_STRING='p1=abc;p2=def;style=high-contrast'./wai-cgi-hello

[10]

Resources, routes, HTTP method handlers

[edit]

See ref.[12][13] Yesod follows therepresentational state transfer model of access to web documents, identifying docs. and directories as resources with a Route constructor, named with an uppercase R suffix (for example, HomeR).

The routes table
The parseRoutes template should list the resources specifying route pieces, resource name and dispatch methods to be accepted.

URL segment capture as parameter is possible specifying a '#' prefix for single segment capture or '*' for multisegment capture, followed by the parameter type.

-- given a MyApp foundation typemkYesod"MyApp"[parseRoutes|/HomeR-- no http methods stated: all methods accepted/blogBlogRGETPOST-- the '#' prefix specify the path segment as a route handler parameter/article/#ArticleIdArticleRGETPUT-- the '*' prefix specify the parameter as a sequence of path pieces/branch/*TextsBranchRGET-- to simplify the grammar, compound types must use an alias, eg. type Texts for ''[Text]''|]
  • Applying the previous template generates the following route constructors:
dataRouteMyApp=HomeR-- referenced in templates as: @{HomeR}|BlogR-- in templates: @{BlogR}|ArticleRArticleId-- in templates: @{ArticleR myArticleId}|BranchRTexts-- in templates: @{BranchR myBranchSegments}
  • For every supportedHTTP method a handler function must be created to match the dispatch names generated bymkYesod from theparseRoutes template, by prefixing the method name (or the prefix "handler" if no method stated) to the resource, as described (actual versions handler types have changed, but the philosophy remains):
-- for "/ HomeR"        -- no http methods stated ⇒ only one handler with prefix ''handler''handlerHomeR::HasRepstHandlert-- for "/blog BlogR GET POST"getBlogR::HasRepstHandlertpostBlogR::HasRepstHandlert-- for "/article/#ArticleId ArticleR GET PUT"getArticleR::HasRepstArticleIdHandlertputArticleR::HasRepstArticleIdHandlert

Request data, parameters, cookies, languages, other header info

[edit]

See ref.[12]

Authentication, authorization

[edit]

See ref.[14] Authentication plugins:OpenID,BrowserID, Email, GoogleEmail, HashDB, RpxNow.[15]

There is an important setting for automatic redirection after authentication.[16]

Sessions

[edit]

See ref.[17] Session back-ends: ClientSession[18] (it stores the session in a cookie), ServerSession[19][20] (it stores most of the session data at the server)

>> To avoid undue bandwidth overhead, production sites can serve their static content from a separate domain name to avoid the overhead of transmitting the session cookie for each request
Session messages
[edit]

A success, failure or indicative message can be stored (setMessage) in the Session and will be shown, if it exists, by thedefault_layout routine through thedefault_layout.hamlet template, being cleared on consultation.[21]

Subsites

[edit]

Common URL prefix subsites for workflows, file serving or site partitioning. See ref.[22][23]

Built-in subsites: Static,[24][25] Auth[26]

Form processing, layout generation

[edit]

See ref.[27]

TheForm type here is an object that is used in thecontroller to parse and process the form fields user input and produce a (FormResult, Widget) pair were the widget holds the layout of the next rendering of the form with error messages and marks. It can also be used to generate a new form with blanks or default values.

The form type takes the shape of a function of an html snippet to be embedded in the view, that will hold security purpose hidden fields.

A form object is generated from anApplicativeMonadic composition of fields for a combined, sequential parsing of field inputs.

There are three types of forms:

  • Applicative (with tabular layout),
  • Monadic (with free layout style), both in the Yesod.Form.Functions module,
  • Input (for parsing only, no view generated) in the Yesod.Form.Input module.

The field generators, whose names are composed by the form type initial(a|m|i)followed by(req|opt){- required or optional -}, have a fieldParse component and a fieldView one.[28]

  • the functionrunForm{Post|Get} runs the field parsers against the form field inputs and generates a (FormResult, Widget) pair from the views offering a new form widget with the received form field values as defaults. The function suffix is the http method used in the form submission.
  • whilegenerateForm{Post|Get} ignores inputs from the client and generates a blank or defaults form widget.[29]

The actual function parameters and types have changed through Yesod versions. Check the Yesod book and libraries signatures.

The magic is in theFormResult data type Applicative instance, where(<*>) collects the error messages for the case ofFormFailure [textErrMsg] result values[30]

Monadic forms permit free form layout and better treatment ofhiddenField members.[27]

A sample of anApplicative[31] form:

-- a record for our form fieldsdataPerson=Person{personName::Text,personAge::Int,personLikings::MaybeText}-- the Form type has an extra parameter for an html snippet to be embedded, containing a CSRF token hidden field for securitytypeFormsubmasterx=HtmlMFormsubmaster(FormResultx,Widget){--- for messages in validation functions:  @param master: yesod instance to use in renderMessage (return from handler's getYesod)  @param languages: page languages to use in renderMessage-- optional defaults record:  @param mbPersonDefaults: Just defaults_record, or Nothing for blank form-}personForm::MyFoundationType[Text]MaybePersonFormsubmasterPerson{- ''aopt'' (optional field AForm component) for "Maybe" fields,   ''areq'' (required fld AForm comp.) will insert the "required" attribute-}personFormmasterlanguagesmbPersonDefaults=renderTable$Person<$>areqtextFieldfldSettingsNamembNameDefault<*>areqcustomPersonAgeFieldfldSettingsAgembAgeDefault<*>aopttextareaFieldfldSettingsLikingsmbLikingsDefaultwherembNameDefault=fmappersonNamembPersonDefaultsmbAgeDefault=fmappersonAgembPersonDefaultsmbLikingsDefault=fmappersonLikingsmbPersonDefaults-- "fieldSettingsLabel" returns an initial fieldSettings record-- recently the "FieldSettings" record can be defined from a String label since it implements IsStringfldSettingsName=(fieldSettingsLabelMsgName){fsAttrs=[("maxlength","20")]}fldSettingsAge=fieldSettingsLabelMsgAgefldSettingsLikings=(fieldSettingsLabelMsgLikings){fsAttrs=[("cols","40"),("rows","10")]}customPersonAgeField=checkvalidateAgeintFieldvalidateAgey|y<18=Left$renderMessagemasterlanguagesMsgUnderAge|otherwise=Righty

View

[edit]

The types shown correspond to an older version, but the philosophy remains.

The Handler monad returns content in one or more of several formats as components of types that implement theHasReps class[32] {RepHtml, RepJson, RepXml, RepPlain, the dualRepHtmlJson, a pair or list of pairs[(ContentType, Content)], ..}.[33][34] Json examples:[35][36][37]

TheHasReps default implementation ofchooseRep chooses the document representation to be returned according to the preferred content-type list of the clientaccept header.[32]

  • Widgets[38] areHTMLDOM codesnippets made by specific commands (e.g. setTitle) or from templates of structure (HTML) / behaviour (JavaScript) / style (CSS), whose types instantiate the classes ToWidget, ToWidgetHead or ToWidgetBody.

A Widget monad,[39] based on a Writer[40] one and argument todefaultLayout, facilitate to piece the widgets together.

Indentation based templates for tree structured markup

[edit]

'$' prefixes lines of logic statements.

Automatic closing tags are generated only for the tag at line start position.

  • thewhamlet quasiquoter returns a Widget expression. (saves to Widget before [hamlet|..|]).
toWidget [hamlet|$doctype 5<html><!-- only the tag at the beginning of the line will be automatically closed --><!-- '.' or '#' prefixes in tags introduce class/id names, à la CSS --><!-- ":boolVar:" prefix in attributes makes them conditionally generated --><!-- interpolation of haskell expressions follow the "shakespearean templates"         syntax introduced in the so named section --><head><title>#{pageTitle} - My Site<linkrel=stylesheethref=@{Stylesheet_route}><body><header>           ^{headerTemplate}<section#mySectionId><p><span.titleClass>_{MsgArticleListTitle}</span>$if null articles<p:isRed:style="color:red">_{MsgSorryNoArticles}$else<ul>$forall art<-articles<li>#{articleNumber art} .-#{articleTitle art}<footer>          ^{footerTemplate}|]
Template interpolation -Shakespearean templates
[edit]

See ref.[42]These are content view templates that follow a common substitution pattern of code expressions within curly brackets with different character prefix to refer to

template expressions with^{...}
refers to other templates of the same type, with given parameters as^{template params},
route expressions with@{...}
safe (typed) urls as@{HomeR},
message expressions with_{...}
i18n message rendering as_{MsgMessageLabel params}
other Haskell expressions with#{...}
haskell expression rendering as#{haskell_expression} which type must be convertible
    • in case ofhamlet html templates, the expression type must be an instance of Text.Blaze.ToMarkup[44]
    • in case ofCSS templates, the expression type must be an instance of Text.Cassius.ToCss[45]
    • in case ofJavaScript templates, the expression type must be an instance of Text.Julius.ToJavascript[46]
    • in case ofi18n message definitions (in "<isoLanguage>.msg" files) with parameter interpolations, the expression type must be an instance of Text.Shakespeare.I18N.ToMessage[47]
    • in case of text/plain templates (for use in emails), the expression type must be an instance of Text.Shakespeare.Text.ToText[48]

Using non-English text in expressions requires use of theUnicode-aware typeText, since theGlasgow Haskell Compiler's (GHC's)show for the typeString renders non-ASCII characters as escaped numerical codes.

External file templates
  • at compile time: Template content can be loaded from external files using compile timesplice calls as$(expr).[49]
  • at run time: There is areload mode for reparsing external template files at every service call, except for HTMLhamlet templates: See doc.[50]
Other templates
[edit]
for JavaScript, CoffeeScript, Roy
thejulius quasiquoter: introduces a JavaScript template.[51] JavaScript variantsCoffeeScript and Roy-language[52] have also specificquasiquoters.[2][51]
for CSS
  • thecassius quasiquoter: introduces a css template with indentation based structuring.[53]
  • thelucius quasiquoter: introduces a css template with standard syntax plus shakespeare-template style substitutions.[54]
TypeScript andJSX templates
thetsc andtscJSX quasiquoters. Only onUNIX derivatives (noWindows by now).[55]
text/plain templates
fore-mail ortext/plainhttpcontent type.[56]
  1. templates:lt: lazy text,st: strict text
  2. templates for text with a left margin delimiter '|':lbt (lazy),sbt (strict)

Localizable messages

[edit]

See ref.[57]

Yesod app messages are localizable (i18n). They should be held within themessages folder, in files named based onISO, as<iso-language>.msg

Message entries follow theEBNF pattern:

-- EBNF: identifier, {' ', parameter, '@', type}, ":", text with interpolationsArticleUnexistentparam@Int64:unexistentarticle#{param}
  • message constructors are formed prepending "Msg" to the message label identifier.
  • the message datatype is formed appending "Message" to the foundation type name.
-- in codemyMsg::MyAppMessage-- datatype appending "Message" to the foundation typemyMsg=MsgArticleUnexistentmyArticleId-- constructor prepending "Msg" to the msg. label-- in widget templates_{MsgArticleUnexistentmyArticleId}

Actuali18n support is missing from thestack app template. ThemkMessage "MyApp" messagesFolder isoLangDefault must be added to the "Foundation.hs" file to get the messages instantiated.[58]

Navigation breadcrumbs

[edit]
  • Navigationbreadcrumbs.[59] A YesodBreadcrumbs instance must be provided for the site where the generator functionbreadcrumb should return for each route a title and parent one. Then, the query functionbreadcrumbs will return the present route title and the ancestors' (route, title) pairs.

Search engine XML Sitemap

[edit]
  • Search enginesXML Sitemaps,[60] wheresitemap returns an XML Sitemap ashttp response, with the routes we want the search engines to crawl, and attributes to instruct the crawler, from a provided list ofSitemapUrl records.

Web feed views

[edit]
  • Web feed views (RDF Site Summary (RSS) –Atom).[61] Handlers returnRepRss, RepAtom, or dualRepAtomRss content (to be selected onaccept headers' preferred content-type list) from a givenFeed structure.

Model

[edit]

Using in-memory mutable data (in the foundation datatype)

[edit]

E.g. a visitor count. See ref.[62]

The Database layer

[edit]
  • persistent is the name of the database access layer with templates for generating types for entities and keys as well as schema initialization.[63][64][65]

There is first class support forPostgreSQL,SQLite,MongoDB,CouchDB andMySQL, with experimental support forRedis.[63]

The Database layout is described in a template listing the entities, fields and constraints.[66]

  • For every entity listed, an integer key column "id" is generated with autoincrement and primary index attributes, with a type alias appending Id to the entity name
  • For every entity listed, a record type named as the entity is generated were record fields names are composed prefixing the entity name to the field name like "personName". An EntityField type "PersonName" is also generated for foreign key referencing from other entities.
  • There is an automaticdatabase schema migration mechanism for DB schema updates, which, to succeed, requires, when adding columns to existent tables, to specifyDefault-column-value constraints withsql level notation.[67]
  • "At most one" cardinality has a special mechanism around the type Checkmark.[68]
  • Weak entities (childs in life constrained owner-child relationships) have no special support for cascade deletetriggers, but there are functions todeleteCascade manually in the Database.Persist.Class module.[69]
automatic table creation, schema update and table migration
Modifications of the entities template produces an schema update with automatic table creation, and migration for theDBMS's that support "ALTER TABLE"SQL commands in amigrateAll procedure, generated from the template content. See "Migrations" in ref.[63] to look for migration awareDBMS.
share[mkPersistsqlSettings,mkMigrate"migrateAll"-- generates the migration procedure with the specified name][persist|User-- table name and entity record type-- implicit autoincrement column "id" as primary key, typed UserIdidentText-- refers to db. table column "ident";-- generates a record field prefixing the table name as  "userIdent"passwordTextMaybe-- Maybe indicates Nullable fieldUniqueUserident-- unique constraint with space sep. field sequenceEmail-- table name and entity record type-- implicit autoincrement column "id" as primary key, typed EmailIdemailTextuserUserId-- foreign key by specifying other tables EntityField typesverkeyTextMaybenewlyAddedColumnText"default='sometext'::character varying"-- sql level Default constraintUniqueEmailemail-- unique constraint|]
  • Esqueleto: is a haskell combinators layer to generate correct relational queries topersistent.[70]

Example forpersistent rawSQL andEsqueleto queries.[71]

E-mail

[edit]

The following packages are part of theyesod-platform:[72]

  • email-validate: Validating an email address.[73]
  • mime-mail: Compose and sendMIME email messages.[74]

Facebook

[edit]
  • Useful glue functions between the fb library and Yesod.[75]

Development cycle

[edit]

New Yesod apps are generated from the HaskellStack tool[76] templates, replacing previous command "yesod init"

Stack based app. template names are prefixed by yesod as "yesod-{minimal | postgres | sqlite | mysql | mongo | ...}"

  • Since HaskellStack uses thestackage repo by default, extra packages from thehackage repo should be referred in the "stack.yaml"extra-deps section.
  • Packages may be customized to a local subfolder. They must be referred in the "stack.yaml"packages section.

The "Yesod helper" tool

[edit]
  • Theyesod helper tool[77]
    • yesod devel run from the project site, recompiles and restarts the project at every file tree modification.
    • yesod add-handler adds a new handler and module to the project, adding animport clause for the handler in the "Application" module.

Deploying with Keter: A web app server monitor and reverse proxy server

[edit]

See refs.[78][79][80]

Keter is a process as a service that handles deployment and restart of Yesodweb app servers, and, perweb app, database creation forPostgreSQL.

The console commandyesod keter packs the web app. as a keter bundle for uploading to a keter folder named "incoming".

Keter monitors the "incoming" folder and unpacks the app. to a temporary one, then assigns the web app a port to listen to, and starts it.

Initially it worked withNginx asreverse proxy (keter version 0.1*), addingvirtual server entries to its configuration and makingNginx reload it, but now Keter itself provides its ownreverse proxy functionality, removing Nginx dependency and acting as the main web server.[81]

Old documentation (Nginx based).[82][83]

Integration withJavaScript generated from functional languages

[edit]

See ref.[84][85][86]

See also

[edit]

References

[edit]
  1. ^"yesodweb/yesod".
  2. ^abc"HaskellWiki - QuasiQuotation". Haskell.org. 2012-05-26. Retrieved2012-10-23.
  3. ^"University of Kent - Comparing Dynamic and Static Language Approaches to Web Frameworks - Yesod vs Ruby on Rails"(PDF). Retrieved2012-10-23.[dead link]
  4. ^"The wai package". Hackage.haskell.org. Retrieved2012-10-23.
  5. ^"The wai-extra package with CGI WAI handler". Hackage.haskell.org. Retrieved2012-10-23.
  6. ^"The wai-handler-fastcgi package". Hackage.haskell.org. Retrieved2012-10-23.
  7. ^"The wai-handler-scgi package". Hackage.haskell.org. Retrieved2012-10-23.
  8. ^"The warp package". Hackage.haskell.org. Retrieved2012-10-23.
  9. ^"The wai-handler-launch package". Hackage.haskell.org. Retrieved2012-10-23.
  10. ^ab"book - Basics". Yesodweb.com. Retrieved2012-10-23.
  11. ^ThemkYesod code[dead link]
  12. ^ab"book - Routing and Handlers". Yesodweb.com. Retrieved2012-10-23.
  13. ^"Playing with Routes and Links". FPComplete.com. 2012-10-17. Archived fromthe original on 2012-11-30. Retrieved2012-10-28.
  14. ^"book - Authentication and Authorization". Yesodweb.com. Retrieved2012-10-23.
  15. ^"The yesod-auth package". Hackage.haskell.org. Retrieved2012-10-26.
  16. ^"book - Sessions - See section "Ultimate Destination"". Yesodweb.com. Retrieved2012-11-17.
  17. ^"Sessions". Yesodweb.com. Retrieved2012-10-23.
  18. ^"Web.ClientSession". Hackage.haskell.org. Retrieved2012-10-25.
  19. ^"ServerSession: secure modular server-side sessions". Hackage.haskell.org. Retrieved2018-10-29.
  20. ^"Web.ServerSession.Frontend.Yesod". Hackage.haskell.org. Retrieved2018-10-29.
  21. ^"Session Messages". Yesodweb.com. Retrieved2018-10-23.
  22. ^"Creating a Subsite". Yesodweb.com. Retrieved2012-10-25.
  23. ^"Yesod and subsites: a no-brainer". Monoid.se. 2012-08-22. Archived fromthe original on 2024-12-11. Retrieved2012-10-28.[]
  24. ^"The Magic of Yesod, part 2 - See section "Static Subsite"". Yesodweb.com. 2010-12-25. Retrieved2012-10-25.
  25. ^"The package yesod-static - Static Subsite". Hackage.haskell.org. Retrieved2012-10-25.
  26. ^"The package yesod-auth - Auth Subsite". Hackage.haskell.org. Retrieved2012-10-25.
  27. ^ab"book - Forms". Yesodweb.com. Retrieved2012-10-23.
  28. ^"Yesod.Form.Fields". Hackage.haskell.org. Retrieved2012-10-23.
  29. ^"Yesod.Form.Functions runFormPost". Hackage.haskell.org. Retrieved2012-10-25.
  30. ^"Yesod.Form.Types". Hackage.haskell.org. Retrieved2012-10-23.
  31. ^"HaskellWiki - Applicative functor". haskell.org. Retrieved2012-10-24.
  32. ^ab"The class HasReps". Hackage.haskell.org. Archived fromthe original on 2013-02-01. Retrieved2012-10-23.
  33. ^"RESTful Content". Yesodweb.com. Retrieved2012-10-23.
  34. ^"The class ToContent". Hackage.haskell.org. Retrieved2012-10-23.[dead link]
  35. ^"More Client Side Yesod: todo sample". Yesodweb.com. 2012-04-23. Retrieved2012-10-23.
  36. ^"JSON Web Service". Yesodweb.com. Retrieved2012-10-23.
  37. ^"The yesod-json package". Hackage.haskell.org. Retrieved2012-10-23.
  38. ^"book - Widgets". Yesodweb.com. Retrieved2012-10-23.
  39. ^"The widget monad". Hackage.haskell.org. Archived fromthe original on 2013-02-01. Retrieved2012-10-23.
  40. ^"The Writer monad". Haskell.org. Retrieved2012-10-23.
  41. ^"Template Haskell Quasi-quotation". Haskell.org. Archived fromthe original on 2013-04-14. Retrieved2012-11-02.
  42. ^ab"book - Shakesperean templates". Yesodweb.com. Retrieved2012-10-23.
  43. ^"The hamlet template module". Hackage.haskell.org. Retrieved2012-10-23.
  44. ^"Class Text.Blaze.ToMarkup". Hackage.haskell.org. Retrieved2012-10-23.
  45. ^"Class Text.Cassius.ToCss". Hackage.haskell.org. Retrieved2012-10-23.
  46. ^"Class Text.Julius.ToJavascript". Hackage.haskell.org. Retrieved2012-10-23.
  47. ^"Class Text.Shakespeare.I18N.ToMessage". Hackage.haskell.org. Retrieved2012-10-24.
  48. ^"Class Text.Shakespeare.Text.ToText". Hackage.haskell.org. Retrieved2012-10-24.
  49. ^"Template Haskell". haskell.org. Archived fromthe original on 2013-04-14. Retrieved2012-11-03.
  50. ^"book - Shakesperean templates # Calling shakespeare". Yesodweb.com. Retrieved2012-10-23.
  51. ^ab"The Julius template module". Hackage.haskell.org. Retrieved2012-10-23.
  52. ^"Roy language". Roy.brianmckenna.org. Archived fromthe original on 2012-10-17. Retrieved2012-10-23.
  53. ^"The Cassius template module". Hackage.haskell.org. Retrieved2012-10-23.
  54. ^"The Lucius template module". Hackage.haskell.org. Retrieved2012-10-23.
  55. ^"The Typescript template module". Hackage.haskell.org. Retrieved2018-10-10.
  56. ^"Shakespeare plain text templates module". Hackage.haskell.org. Retrieved2012-10-24.
  57. ^"book - Internationalization". Yesodweb.com. Retrieved2012-10-23.
  58. ^mkMessage
  59. ^"The YesodBreadcrumbs class". Hackage.haskell.org. Retrieved2012-11-05.
  60. ^"The yesod-sitemap package". Hackage.haskell.org. Retrieved2012-10-26.
  61. ^"The yesod-newsfeed package for RSS / Atom views". Hackage.haskell.org. Retrieved2012-10-26.
  62. ^"Book - Initializing data in the foundation datatype". Yesodweb.com. Retrieved2014-05-26.
  63. ^abc"book - Persistent". Yesodweb.com. Retrieved2012-10-23.
  64. ^"Yesod-persistent package". Hackage.haskell.org. Retrieved2012-10-23.
  65. ^"Yesod-persistent docs". github.com. Retrieved2018-10-16.
  66. ^"Yesod-persistent entity syntax". github.com. Retrieved2018-10-16.
  67. ^"Redundant migrations for fields' default values". GitHub.com. Retrieved2012-12-04.
  68. ^""At most one" cardinality enforcement inpersistent with type Checkmark". Hackage.haskell.org. Retrieved2018-10-16.
  69. ^"How can I create a foreign key constraint using Yesod/Persistent?". stackoverflow.com. Retrieved2018-10-16.
  70. ^"esqueleto package". Hackage.haskell.org. Retrieved2012-10-23.
  71. ^"Query example at". Stackoverflow.com. 2012-09-19. Retrieved2012-10-23.
  72. ^"The yesod package". Hackage.haskell.org. Retrieved2019-06-26.
  73. ^"The email-validate package". Hackage.haskell.org. Retrieved2012-10-26.
  74. ^"The mime-mail package". Hackage.haskell.org. Retrieved2012-10-26.
  75. ^"The yesod-fb package". Hackage.haskell.org. Retrieved2012-10-26.
  76. ^Haskell Stack - How to install
  77. ^The yesod-bin pkg with the helper tool (with instructions for use with thestack tool)
  78. ^"book - Deploying your Webapp". Yesodweb.com. Retrieved2012-10-23.
  79. ^Readme.Md."Yesod keter readme". GitHub. Retrieved2012-10-23.
  80. ^"The keter package". Hackage.haskell.org. Retrieved2012-10-23.
  81. ^"Keter updates". Yesodweb.com. 2012-10-25. Retrieved2012-10-25.
  82. ^"Keter: Web App Deployment". Yesodweb.com. 2012-05-11. Retrieved2012-10-23.
  83. ^"Keter: It's Alive!". Yesodweb.com. 2012-05-17. Retrieved2012-10-23.
  84. ^"Javascript Options". github.com. Retrieved2014-03-12.
  85. ^"Yesod, AngularJS and Fay". yesodweb.com. 2012-10-30. Retrieved2014-03-12.
  86. ^"HaskellWiki - The JavaScript Problem". haskell.org. Retrieved2014-04-12.

External links

[edit]

Blog tutorials

[edit]

Comparisons

[edit]

Other languages

[edit]

At Linux distributions

[edit]
.NET
C++
ColdFusion
Common Lisp
Haskell
Java
JavaScript
Back end
Server-side
Full-stack
Front end
Client-side
Perl
PHP
Python
Ruby
Rust
Scala
Smalltalk
Other languages
Haskell programming
Software
Implementations
(features)
Dialects
Electronic
design
Libraries
Package managers
Windowing systems
Web frameworks
Book
Community
Eponym
Italics= discontinued° =Open-source software
BookCategories:FamilySoftware
Retrieved from "https://en.wikipedia.org/w/index.php?title=Yesod_(web_framework)&oldid=1334689460"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2026 Movatter.jp