我发现想要在我的功能程序中建模关系数据是很常见的.例如,在开发网站时,我可能希望使用以下数据结构来存储有关我的用户的信息:
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) 我想知道在重新加载模块时是否可以在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中的每一行代表一个(单一地)绑定到下一个的函数,我仍然想知道是否可以保持该状态.
我正在使用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.