2017-11-14 1 views
2

GegebenVerwenden Lucid für einfaches Beispiel

/Users/kevinmeredith/Workspace/my-project/src/Lib.hs:9:18: error: 
    • Couldn't match type ‘HtmlT Data.Functor.Identity.Identity()’ 
        with ‘[Char]’ 
     arising from a functional dependency between: 
      constraint ‘Term [Char] (HtmlT Data.Functor.Identity.Identity())’ 
      arising from a use of ‘p_’ 
      instance ‘Term (HtmlT m a) (HtmlT m a)’ at <no location info> 
    • In the first argument of ‘div_’, namely ‘(p_ "hello")’ 
     In the expression: div_ (p_ "hello") 
     In an equation for ‘mainPage’: mainPage = div_ (p_ "hello") 

Wie kann ich diesen Fehler bei der Kompilierung beheben bitte?

Antwort

3

Wie in den documentation geschrieben:

Intro

(..)

For GHCi :

:set -XOverloadedStrings [email protected] 
import Lucid 

In a module: {-# LANGUAGE OverloadedStrings, ExtendedDefaultRules #-}

(..)

Sie müssen also auf den OverloadedStrings und ExtendedDefaultRules Erweiterungen drehen.

Sie können dies mit Kompilieren von tun:

ghc -XOverloadedStrings -XExtendedDefaultRules file.hs

Aber vielleicht ist bequemer zu die Erweiterungen auf im Header der Datei drehen:

{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ExtendedDefaultRules #-} 

import Lucid 
import Lucid.Base 

mainPage :: Html() 
mainPage = div_ (p_ "hello")

Wie der Compiler sagt in der Fehlermeldung, p_ und div_ do nicht erwarten String s, bu t eine HtmlT Data.Functor.Identity.Identity() Art (irgendeine Art Schnur). Dieser Typ ist jedoch ein Mitglied der IsString typeclass, so kann es als „String-like“ Typen zu sehen ist, und hat eine Implementierung [source code]:

instance (Monad m,a ~()) => IsString (HtmlT m a) where 
    fromString = toHtml 

Der Grund, warum dies passiert ist, weil Sie können HTML-Zeichen hinzufügen In diesem Fall würde (p_ "<foo>") wie folgt aussehen: <p><foo></p>. Aber das ist ziemlich unsicher. Durch die erste Verarbeitung durch toHtml wird das Ergebnis <p>&lt;foo&gt;</p> sein.

Verwandte Themen