具有haskell和数据库访问的纯功能

时间:2016-01-11 15:34:28

标签: haskell functional-programming

如何判断一个函数是纯粹的:

  • 无状态:给定相同的参数,结果严格相同(1 + 2 = 3)
  • 不变性:价值不随时间变化

在数据访问环境中?

承认我有一个getAll函数来检索表的所有用户。此用户可以随时间变化,添加,删除等...

如何才能使getAll成为纯函数?

1 个答案:

答案 0 :(得分:4)

免责声明:我对lisp了解不多,无法提供有关该语言情况的任何信息。我只知道那里有类似计划的东西 - 但我再也不了解它的类型系统的力量。

如何判断函数是否纯粹(在数据访问上下文中)

在haskell中,您可以在其类型签名中查看/编码有关函数纯度的信息。我猜想getAll的签名会是这样的:

getAll :: DBConn -> IO Tables

这里IO标志着该功能的杂质。在haskell中,这种杂质建模可以用Monads一般的抽象来完成,这种情况很常见。

如何使函数纯净?

现在你可以轻松摆脱Monads - 例如Maybe你可以使用fromMaybe defaultValue maybeValue摆脱monad环境。

IO与此不同 - 没有安全的方法可以离开monad上下文,特别是有unsafePerformIO可以破坏类型系统以使编译器相信"在这种情况下它可以离开IO",但除非你真的知道你在做什么 - 不要用这个!!!

但也许这是错误的问题 - 更好的问:

如何将纯函数与不纯函数结合在一起?

现在有几个抽象可以帮助你在monadic或类似的上下文中绑定纯函数,我建议首先寻找FunctorApplicative和(当然)Monad

例如,如果你有一个函数users :: Table -> [User],你可以使用Functor抽象将它们联系在一起

fmap users (getAll conn) (:: IO [User])

或等效

users <$> (getAll conn)

请注意,此计算的结果在users部分是纯粹的 - 并获得杂质指标(nameley IO ..)&#34;继承&#34;来自getAll conn部分。

您可以想象在IO标记内执行用户功能。