Skip to content

Instantly share code, notes, and snippets.

@lagenorhynque
Last active March 3, 2019 15:45
Show Gist options
  • Save lagenorhynque/3cee0980d52cb2f1037d24815482d7bf to your computer and use it in GitHub Desktop.
Save lagenorhynque/3cee0980d52cb2f1037d24815482d7bf to your computer and use it in GitHub Desktop.
Simple "user" modelling examples in Clojure, Haskell & Scala.
(ns model
(:require [clojure.spec.alpha :as s]))
(s/def :user/first-name string?)
(s/def :user/last-name string?)
(s/def :user/full-name string?)
(s/def ::user (s/keys :req [:user/first-name
:user/last-name]))
(s/fdef full-name
:args (s/cat :user ::user)
:ret :user/full-name)
(defn full-name [{:user/keys [first-name last-name]}]
(str first-name " " last-name))
(defn -main [& args]
(let [u #:user{:first-name "You"
:last-name "Watanabe"}]
(println (str "user: " u))
(println (str "user's full name: " (full-name u)))))
{-# LANGUAGE NamedFieldPuns #-}
module Model where
data User = User { firstName :: !String
, lastName :: !String
}
deriving Show
fullName :: User -> String
fullName User{firstName, lastName} = firstName ++ " " ++ lastName
main :: IO ()
main = do
let u = User { firstName = "You", lastName = "Watanabe"}
putStrLn $ "user: " ++ show u
putStrLn $ "user's full name: " ++ fullName u
case class User(firstName: String, lastName: String) {
val fullName = s"$firstName $lastName"
}
object Model extends App {
val u = User(firstName = "You", lastName = "Watanabe")
println(s"user: $u")
println(s"user's full name: ${u.fullName}")
}
@lagenorhynque
Copy link
Author

Execution results:

$ clj -Sdeps '{:paths ["."]}' -m model
user: #:user{:first-name "You", :last-name "Watanabe"}
user's full name: You Watanabe
$ runghc Model.hs
user: User {firstName = "You", lastName = "Watanabe"}
user's full name: You Watanabe
$ scala Model.scala
user: User(You,Watanabe)
user's full name: You Watanabe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment