这是我第二次尝试学习Haskell,而我一直听到的一件事就是不要重复自己(其他语言也是如此).
无论如何......我正在尝试实现一个博客并发现需要在数据库上实现CRUD操作,但是当我为评论,帖子和用户实现CRUD时,在我看来,我只是在重复自己.
问题是我看不出怎么不重复自己.
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Model where
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Logger (runStderrLoggingT)
import Database.Persist
import Database.Persist.Postgresql
import Database.Persist.TH
import Data.Time
import Data.Int
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Users
email String
password String
alias String
image_url String
show_email Bool
UniqueEmail email
date UTCTime default=CURRENT_TIMESTAMP …Run Code Online (Sandbox Code Playgroud) 这显示了我想做的事情的精神,它几乎可以工作(只是不在我当前的 nix 设置内):
echo :: IO ()
echo = getLine >>= putStrLn
testEcho :: IO ()
testEcho = do
(Just stdin_hdl, Just stdout_hdl, m_stderr_hdl, p_hdl)
<- createProcess $
(shell ("nix run .#echo"))
{ std_in = CreatePipe
, std_out = CreatePipe
}
hPutStrLn stdin_hdl "Hello, echo!"
hClose stdin_hdl
!response <- hGetContents stdout_hdl
cleanupProcess (Just stdin_hdl, Just stdout_hdl, m_stderr_hdl, p_hdl)
if response == "Hello, echo!" then
putStrLn "Success!"
else error "Failure"
Run Code Online (Sandbox Code Playgroud)
基本上我想要类似的东西createProcess,但有一种类型createProcess :: IO () -> -> IO (Maybe …