2011-04-23 42 views
6

这是我第一个使用Haskell的程序。我正在写这篇文章来实践我读过的有关FP的所有内容。我试图弄清楚的第一件事是如何建模我将从数据库中提取的数据(最终我也会写入数据库)。我开始与我users表,写了这样的事情DB支持应用程序的Haskell数据结构

module Model (User) where 

class Audited a where 
    creationDate :: a -> Integer 
    lastUpdatedDate :: a -> Integer 
    creationUser :: a -> User 
    lastUpdatedUser :: a -> User 

class Identified a where 
    id :: a -> Integer 

data User = User {userId :: Integer} 

instance Identified User where 
    id u = userId u 

module Main (main) where 
import Model (User) 

data Point = Pt {pointx, pointy :: Float} 

instance Show Point where 
    show (Pt x y) = "(" ++ show x ++ ", " ++ show y ++ ")" 

main :: IO() 
main = do 
    print $ Pt 1 2 

(该Point东西只是我的测试...这是我的第一个Haskell代码有史以来)

这段代码没有编译,但我并没有真正关心这个问题 - 最重要的是让我的类型设置得很好。

这里是我有

  • 什么是在Haskell基于记录的数据进行建模的最好方法问题的清单?
  • 我的大部分表格都有审计信息和不透明的ID。我如何利用Haskell类型系统来利用这一点?你可以看到我创建了Audited和Identified类。这是一个好方法吗?
  • 这是Haskell的一个很好的应用程序吗?我正在考虑使用Clojure,因为它可以与Java互操作(此应用程序目前用Java编写)。
+1

顺便说一句,定义一个函数'id'不是一个好主意。通常,'id'是定义为'id x = x'的标识函数,因此非常重要。 – fuz 2011-04-23 19:04:58

+0

你好。我看到你正在使用Haskell和一个数据库,并且还使用了Scala中的代码。你能看看我的问题吗?如果像我们通常在FP中那样拥有不可变对象时如何处理数据库?你使用可变类来访问数据吗? http://stackoverflow.com/questions/12882099/how-to-update-object-in-mongo-with-an-immutable-salat-case-class – 2012-10-20 22:21:44

回答

8

建立基于记录的数据的最佳方式是什么?

作为可能具有(Haskell)记录组件的代数数据类型。

简单示例:the JSValue data type,表示JSON记录。

如何利用Haskell类型系统?

虽然使用newtype或其他数据类型,但不导出其构造函数提供了同样强大的抽象属性,但通过类型类的Haskell中的接口是有效的方法。如使用存在类型广义代数数据类型(GADT)。

例如:看例如如何使用newtypein this example

示例:newtype用于向PCRE库添加类型安全性和抽象。

这是Haskell的一个很好的应用程序吗?

似乎完全córiculent。强大的类型,强大的FFI以及大量的libraries on Hackage帮助意味着您拥有大量技术来帮助完成工作。

实施例:有许多,许多数据库存取库Haskell中,如:

和古老的hdbc,这是also documented in RWH

和漂亮的高级包magically persistening Haskell data

所以有很多选择,并有大量的例子可以开始。

+0

感谢您的答案。我是一个Haskell nube。如果你能举几个你正在谈论的简短例子,那将是非常棒的。 – 2011-04-23 17:20:57