出先でしたのでご返信遅れてしまいすいません。
動作確認できました!
お手伝いいただいたみなさまありがとうございました!!
これからの拡張はどこを参考にしたらよいでしょうか…?
動作確認できました!
お手伝いいただいたみなさまありがとうございました!!
これからの拡張はどこを参考にしたらよいでしょうか…?
--open 知らなかった
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Logger (runNoLoggingT)
import Database.Persist
import Database.Persist.Sqlite
import
import qualified Database.Esqueleto as E
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
name String
age Int Maybe
deriving Eq Show
|]
main :: IO ()
main = runNoLoggingT . withSqlitePool ":memory:" 10 . runSqlPool $ do
runMigration migrateAll
insert $ Person "John" (Just 18)
insert $ Person "Peter" (Just 20)
insert $ Person "Mary" (Just 30)
insert $ Person "Jane" (Just 14)
selectCount
selectCount' (\p -> do
E.where_ (p E.^. PersonName E.==. E.val "John")
return p
)
selectCount :: MonadIO m => SqlPersistT m ()
selectCount = do
cnt <- E.select $ E.from $
(\(_ :: E.SqlExpr (Entity Person)) -> return (E.countRows :: E.SqlExpr (E.Value Int)))
liftIO $ print cnt
selectCount' :: (E.From a, MonadIO m) => (a -> E.SqlQuery b) -> SqlPersistT m ()
selectCount' q = do
cnt <- E.select $ E.from $
(\x -> q x >> return (E.countRows :: E.SqlExpr (E.Value Int)))
liftIO $ print cnt
λ stack repl Es.hs --resolver lts-14.5 --package persistent-sqlite --package esqueleto --package persistent --package persistent-template --package monad-logger
*Main> main
Migrating: CREATE TABLE "person"("id" INTEGER PRIMARY KEY,"name" VARCHAR NOT NULL,"age" INTEGER NULL)
[Value {unValue = 4}]
[Value {unValue = 1}]
esqueleto のことはあまり知らないのでアドバイスしづらいですが、 E.countRows の型を明示的に書いてあげると動きました。parseTest ((between (optional $ single ' ') (optional $ single ' ') (single 'a' `sepBy` single ' ')) <* eof :: Parsec Void Text [Char]) $ pack "a a "
1:6: | 1 | a a | ^ unexpected end of input expecting 'a'
sepBy (single ' ') が空白を先に受理して、空白のあとは 'a' が来ないと行けないからじゃない?sepEndBy でパースはできそう(それが意図してる動作なのかは怪しいけど)selectCount :: (MonadIO m, E.From a) => (a -> E.SqlQuery b) -> SqlPersistT m [E.Value Int] selectCount q = E.select $ E.from $ (\x -> q x >> return (E.countRows :: E.SqlExpr (E.Value Int)))
class MyEq a where eq :: a -> a -> Bool instance MyEq Integer where eq = (==)
main = print $ eq 1 2 は Ambiguous type variable になるのにmain = print $ 1 == 2 は Ambiguous type variable にならないのはなぜでしょうか。Num 型クラスのデフォルトである Integer が選ばれた、まではわかるのですが、なぜ Eq 型クラスの場合のみデフォルトが採用されたのでしょうか?