我有一个有6种不同类型实体的模式,但它们都有很多共同点.我想我可能在类型级别抽象了很多这种共性,但我遇到了HaskellDB和重叠实例的问题.这是我开始使用的代码,工作正常:
import Database.HaskellDB
import Database.HaskellDB.DBLayout
data Revision a = Revision deriving Eq
data Book = Book
instance FieldTag (Revision a) where
fieldName _ = "rev_id"
revIdField :: Attr (Revision Book) (Revision Book)
revIdField = mkAttr undefined
branch :: Table (RecCons (Revision Book) (Expr (Revision Book)) RecNil)
branch = baseTable "branch" $ hdbMakeEntry undefined
bookRevision :: Table (RecCons (Revision Book) (Expr (Revision Book)) RecNil)
bookRevision = baseTable "book_revision" $ hdbMakeEntry undefined
masterHead :: Query (Rel (RecCons (Revision Book) (Expr (Revision Book)) …Run Code Online (Sandbox Code Playgroud) 在SQL和关系理论(CJ Date,2009)中,第4章主张避免重复行,并避免NULL存储数据中的属性.虽然我没有避免重复行的麻烦,但我很难看到如何在不使用的情况下对数据进行建模NULL.举个例子来说 - 这有点像下班.
我们有一个artist表,其中包含一gender列.这是gender表的外键.然而,对于一些艺术家来说,我们并不知道他们的性别 - 例如,我们已经获得了一个没有艺术家描述的新音乐列表.如何在不使用的NULL情况下表示这些数据?我看到的唯一解决方案是在gender表格中添加一个新的性别"未知" .
虽然我非常喜欢这本书,但在本章结束时我真的很失望:
当然,如果禁止空值,则必须通过其他方式处理丢失的信息.不幸的是,那些其他手段太复杂了,不能在这里详细讨论.
这是一个真正的耻辱 - 因为这是我等待阅读的解决方案!有一篇参考资料来阅读有很多出版物要阅读的附录,但在我潜入阅读这些内容之前,我希望能有更多的实际总结.
我有几个人评论说他们不明白我为什么要避免'NULL'所以我会再次引用这本书.请执行以下查询:
SELECT s.sno, p.pno
FROM s, p
WHERE s.city <> p.city
OR p.city <> 'Paris'
Run Code Online (Sandbox Code Playgroud)
现在,以s.city为伦敦为例,p.city为Paris.在这种情况下,伦敦<>巴黎,所以查询是真的.现在假设p.city不是Paris,并且实际上是xyz.在这种情况下,(London <> xyz)OR(xyz <> Paris)也是True.所以,给定任何数据 - 这个查询都是真的.但是,如果xyz为"NULL",则场景会发生变化.在这种情况下,这两个表达式既不是True 也不是 False,它们实际上是Unknown.在这种情况下,因为结果未知,您将不会返回任何行.
从2值逻辑到3值逻辑的转变很容易引入这样的错误.事实上,我刚刚在工作中介绍了一个激励这篇文章的内容.我想要所有的行,type != 0然而,这实际上最终匹配type == 0 OR type IS NULL- 令人困惑的行为.
我是否NULL在未来对数据进行建模尚不清楚,但我很好奇其他解决方案是什么.(我也一直认为,如果你不知道,你应该使用NULL).
我刚刚Const在文档中找到了Control.Applicative,但是我很难找到有用的地方,而不是直接使用Monoid.
我错过了什么?
我transformers在最近的博客文章中写过,有人问"人们使用Control.Applicative.Lift做什么?" 我不能回答这个问题,所以我呼应问题StackOverflow的-什么是 Control.Applicative.Lift干什么用的?
我在包中看到了一个使用它的例子,但我似乎完全无法解析它的作用.有没有人知道野外任何其他的例子?
在工作中,我们发现我们的测试套件已经到了重复运行的速度太慢,我真的不喜欢.整个套件至少需要5分钟,后端数据对象测试需要3分钟以上.所以,我很想知道人们如何进行测试.
目前,我们有一个具有实时架构和_test架构的数据库服务器.当测试运行时,它首先运行一个SQL脚本,该脚本说明如何填充测试数据库(并清除可能妨碍的任何旧数据).几乎所有测试都会发生这种情况 从我所看到的,这是我们测试中最大的瓶颈 - 我刚刚介绍了一个测试,设置数据库需要大约800ms,然后每个后续测试运行大约10ms.
我一直试图找出一些解决方案,这是我到目前为止所发现的:
将测试模式填充一次,并在每次测试结束时回滚更改.
这似乎是最简单的解决方案,但它确实意味着我们将不得不添加一些特殊情况来测试依赖于回滚的事情(即错误处理测试).
尽可能模拟数据库
我们将为正在测试的数据对象设置数据库,但是模拟它依赖的任何东西.对我而言,由于两个原因,这似乎并不出色.首先,当我们设置数据库时,由于外键依赖性,我们仍然(通常)会得到更多的行.其次,大多数数据对象模型并不真正与其他模型交互,它们只是做JOIN.
运行相同的系统,但使用转储和RAMFS
我们不是运行大型SQL查询,而是加载数据库转储.测试服务器将在RAMFS分区上运行,并希望带来一些速度优势.
我无法测试这个,因为我在OSX上,从我所看到的,没有ramfs支持.
还有其他一些选择,比如使用SQLite,但这不是我们的选择,因为我们依赖于一些PostgreSQL特定的扩展.
HALP!:)
用户'singpolyma' 在reddit上询问是否存在一些基本结构:
data FailList a e = Done | Next a (FailList a e) | Fail e
Run Code Online (Sandbox Code Playgroud)
建议使用免费的monad,但我想知道是否可以通过applicative functors更一般地建模.在使用Applicatives的抽象中,Bazerman向我们展示了两个应用函子的总和也是一个应用函子,左/右偏向,只要我们在偏差的方向上有一个自然的变换.这听起来像是我们需要的!因此,我开始提出建议,但很快就遇到了问题.谁能看到这些问题的解决方案?:
首先,我们从两个仿函数之和的定义开始.我从这里开始是因为我们想要建模和类型 - 成功或成功以及失败.
data Sum f g a = InL (f a) | InR (g a)
Run Code Online (Sandbox Code Playgroud)
我们想要使用的两个仿函数是:
data Success a = Success [a]
data Failure e a = Failure e [a]
Run Code Online (Sandbox Code Playgroud)
Success直截了当 - 基本上就是这样Const [a].但是,Failure e我不太确定.它不是一个应用程序的函子,因为pure没有任何定义.但是,它是Apply的一个实例:
instance Functor Success where
fmap f (Success a) = Success a
instance Functor …Run Code Online (Sandbox Code Playgroud) haskell algebra non-deterministic category-theory applicative
特定
newtype Tree m a = Tree { runTree :: m (Node m a) }
data Node m a = Node
{ nodeValue :: a
, nodeChildren :: [Tree m a]
}
Run Code Online (Sandbox Code Playgroud)
有没有有效的MonadFix实例?
我的尝试是
instance MonadFix m => MonadFix (Tree m) where
mfix f = Tree $ do
Node
<$> mfix (runTree . f . nodeValue)
<*> fmap nodeChildren (runTree (mfix f))
Run Code Online (Sandbox Code Playgroud)
然而,当我真正尝试使用它时,这似乎并没有终止.该实例受到MonadFix列表实例的启发.
我目前正在构建一个新的API,它目前提供的功能之一是:
inSpan :: Tracer -> Text -> IO a -> IO a
Run Code Online (Sandbox Code Playgroud)
我Tracer想把它变成一个monad,给我一个更像的签名
inSpan :: MonadTracer m => Text -> m a -> m a
Run Code Online (Sandbox Code Playgroud)
实行inSpan用途bracket,这意味着我有两个主要选择:
class MonadUnliftIO m => MonadTracer m
Run Code Online (Sandbox Code Playgroud)
要么
class MonadMask m => MonadTracer m
Run Code Online (Sandbox Code Playgroud)
但我应该选择哪个?请注意,我控制了我提到的所有类型,这使我略微倾向于MonadMask因为它不在IO底层强制执行(也就是说,我们可能有一个纯MonadTracer实例).
还有什么我应该考虑的吗?
我正在尝试为Wavefront .obj文件格式编写一个解析器,这是一种非常愚蠢的基于行的格式.希望维基百科文章应该总结它是如何工作的,但基本上你有行记录顶点,普通和其他数组中的条目.最后,面定义是这些单独数组中的三个(或更多)索引.
我的解析器是
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
module WavefrontObj where
import Control.Applicative
import Data.Attoparsec.Text
import Data.Foldable (toList)
import Data.List (foldl')
import Data.List.Split
import Data.Monoid
import Data.NonEmpty ((!:))
import Data.Sequence (Seq)
import Geometry
import Graphics.GL
import Linear
import Linear.Affine
import qualified Data.Sequence as Seq
data Obj =
Obj {objVertices :: !(Seq (V3 Double))
,objNormals :: !(Seq (V3 Double))
,objFaces :: !(Seq (V2 (V3 Int)))}
deriving (Show)
instance Monoid Obj where
mempty = Obj mempty …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
{-# LANGUAGE DefaultSignatures#-}
import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe
class Monad m => MonadMaybe m where
liftMaybe :: Maybe a -> m a
default liftMaybe :: (MonadTrans t, MonadMaybe m) => Maybe a -> t m a
liftMaybe = lift . liftMaybe
instance MonadMaybe m => MonadMaybe (MaybeT m)
Run Code Online (Sandbox Code Playgroud)
使用Glorious Glasgow Haskell编译系统,版本8.0.1.20161117,无法编译:
foo.hs:11:10: error:
• Couldn't match type ‘m’ with ‘MaybeT m’
‘m’ is a rigid type variable bound by
the instance declaration at foo.hs:11:10
Expected type: Maybe a -> MaybeT …Run Code Online (Sandbox Code Playgroud)