Update: Siehe Chris Allen article zu diesem Thema.
ein Blog
Modell als Beispiel:
Zuerst müssen wir unser uuid
Feld und eine Einzigartigkeit Einschränkung auf diesem Feld hinzuzufügen, so dass wir unsere UUID eindeutig sein wird und Lookups werden schnell sein. Die in unserem Modell definierten Felder entsprechen den Feldern in unserer Anwendungsform.
-- config/models
Blog
title Text
content Text
user UserId
createdAt UTCTime
uuid Text default=uuid_generate_v4()
UniqueUuid uuid
Dann in unserem applicative Form importieren wir zwei Module, die uns die UUID Funktionen geben wir brauchen, und einen Wert entweder in einem monadischen oder applicative Stil extrahieren.
-- Handler/Home.hs
import Data.UUID
import Data.UUID.V4
form :: UserId -> Form Blog
form userId = renderDivs $ Blog
<$> areq textField "Title" Nothing
<*> areq textareaField "Contents" Nothing
<*> pure userId
<*> lift (liftIO getCurrentTime)
-- either use the following line (monadic style)
<*> lift (liftIO $ do { key <- nextRandom; return $ toText key })
-- ...or use this style (applicative style)
<*> lift (fmap toText $ liftIO nextRandom)
fragte ich einen hilfreichen Haskeller in einem IRC-Kanal, was der Unterschied zwischen den beiden Ansätzen war, und das war ihre Antwort:
Irgendwie gefällt mich persönlich die Monade Version mehr ... Aber es ist syntaktisch zu teuer, also in diesem Fall würde ich wahrscheinlich mit der fmap
Version gehen ... aber wenn ich mehr Verarbeitung auf der UUID tun würde, würde ich definitiv die Monad-Version gehen, aber IO ist eine Monad-Klasse, so dass es auch Functor implementieren muss Typ Klasse ... Sie können denken, dass mit einem fmap
ist mehr "Low-Level"
n.b. Möglicherweise müssen Sie die Erweiterung uuid-ossp
in Ihrer Datenbank aktivieren. Sie können das tun, indem Sie CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
ausführen.