小编JHa*_*nes的帖子

Haskell中关系数据的安全建模

我发现想要在我的功能程序中建模关系数据是很常见的.例如,在开发网站时,我可能希望使用以下数据结构来存储有关我的用户的信息:

data User = User 
  { name :: String
  , birthDate :: Date
  }
Run Code Online (Sandbox Code Playgroud)

接下来,我想存储有关用户在我的网站上发布的消息的数据:

data Message = Message
  { user :: User
  , timestamp :: Date
  , content :: String
  }
Run Code Online (Sandbox Code Playgroud)

此数据结构存在多个问题:

  • 我们无法区分具有相似姓名和出生日期的用户.
  • 用户数据将在序列化/反序列化时重复
  • 比较用户需要比较他们的数据,这可能是昂贵的操作.
  • 对字段的更新User是脆弱的 - 您可能忘记更新User数据结构中的所有事件.

这些问题是可管理的,而我们的数据可以表示为树.例如,您可以像这样重构:

data User = User
  { name :: String
  , birthDate :: Date
  , messages :: [(String, Date)] -- you get the idea
  }
Run Code Online (Sandbox Code Playgroud)

但是,可以将数据整形为DAG(想象任何多对多关系),甚至可以作为一般图形(好的,也许不是).在这种情况下,我倾向于通过在Maps中存储我的数据来模拟关系数据库:

newtype Id a = Id Integer
type Table a = …
Run Code Online (Sandbox Code Playgroud)

haskell relational-database type-safety in-memory-database

37
推荐指数
4
解决办法
3647
查看次数

ghci:在模块重新加载后将定义的值保留在范围内

我想知道在重新加载模块时是否可以在ghci中保留指定的值?

例如,我在ghci中分配一个值:

ghci> let x = 1
Run Code Online (Sandbox Code Playgroud)

要么

ghci> x <- getLine
Run Code Online (Sandbox Code Playgroud)

进入:r重新加载后,现有模块x不再在范围内.通常是否可以保持分配可用,例如在Python解释器中?(这真的很方便......)

即使实际上ghci中的每一行代表一个(单一地)绑定到下一个的函数,我仍然想知道是否可以保持该状态.

haskell ghci

7
推荐指数
1
解决办法
447
查看次数

使用Vim在文本换行中自动继续使用Haskell注释中的前导破折号

我正在使用Vim编辑我的Haskell源文件,并设置了'textwidth'选项以自动换行超长行.所以我的〜/ .vimrc看起来像:

set tw=78
Run Code Online (Sandbox Code Playgroud)

现在,当我写一个长度超过78个字符的行时,最后一个字会自动转到下一行.这对于在源文件中编写注释非常有用.好的一点是,在注释中,当最后一行太长并自动包装时,前导注释符号会自动插入每行的开头.但这只适用于C风格的评论,但遗憾的是不适用于Haskell领先的破折号.

所以,例如在JS文件中

/**
 * This is a very long comment which is longer than 78 chars, yeah really 
 * longer than 78 chars...
Run Code Online (Sandbox Code Playgroud)

得到很好的包装

// This is a very long comment which is longer than 78 chars, yeah really 
// longer than 78 chars...
Run Code Online (Sandbox Code Playgroud)

所以现在如果在Haskell评论中发生同样的情况会很好

------------------------------------------------------------------------------
-- | This is a very long module description which is longer than 78 chars,
--   yeah really longer than 78 chars...
Run Code Online (Sandbox Code Playgroud)

有人知道这是否可能以及如何实现?指定了这种行为在哪里?是:设置formatexpr或:set formatoptions帮我吗?

在此先感谢您的帮助!

= <<约翰内斯

/编辑:顺便说一句我使用vim 7.3.x.

vim haskell comments

5
推荐指数
1
解决办法
323
查看次数