如何判断一个函数是纯粹的:
在数据访问环境中?
承认我有一个getAll函数来检索表的所有用户。此用户可以随时间变化,添加,删除等...
如何才能使getAll成为纯函数?
答案 0 :(得分:4)
免责声明:我对lisp了解不多,无法提供有关该语言情况的任何信息。我只知道那里有类似计划的东西 - 但我再也不了解它的类型系统的力量。
在haskell中,您可以在其类型签名中查看/编码有关函数纯度的信息。我猜想getAll
的签名会是这样的:
getAll :: DBConn -> IO Tables
这里IO
标志着该功能的杂质。在haskell中,这种杂质建模可以用Monads
一般的抽象来完成,这种情况很常见。
现在你可以轻松摆脱Monads - 例如Maybe
你可以使用fromMaybe defaultValue maybeValue
摆脱monad环境。
IO
与此不同 - 没有安全的方法可以离开monad上下文,特别是有unsafePerformIO
可以破坏类型系统以使编译器相信"在这种情况下它可以离开IO
",但除非你真的知道你在做什么 - 不要用这个!!!
但也许这是错误的问题 - 更好的问:
现在有几个抽象可以帮助你在monadic或类似的上下文中绑定纯函数,我建议首先寻找Functor
,Applicative
和(当然)Monad
。
例如,如果你有一个函数users :: Table -> [User]
,你可以使用Functor
抽象将它们联系在一起
fmap users (getAll conn) (:: IO [User])
或等效
users <$> (getAll conn)
请注意,此计算的结果在users
部分是纯粹的 - 并获得杂质指标(nameley IO ..
)&#34;继承&#34;来自getAll conn
部分。
您可以想象在IO
标记内执行用户功能。