haskell - 有人可以用*非常*简单的术语解释反射包 API 吗?
问题描述
我很难理解描述反射包的文档/示例。我是一名命令式编程老手,但也是一名 Haskell 新手。你能引导我完成一个非常简单的介绍吗?
包:https ://hackage.haskell.org/package/reflection
编辑:对于结束这个问题的人:这是对 Haskell 反射的初学者介绍。下面的答案非常好,其他答案也很有用,所以请重新打开。
解决方案
在最简单的用例中,如果您有一些配置信息希望在一组函数中普遍可用:
data Config = Config { w :: Int, s :: String }
您可以Given Config
向需要访问配置的函数添加约束:
timesW :: (Given Config) => Int -> Int
然后使用该值given
来引用当前配置(等等w given
或s given
引用其字段):
timesW x = w given * x
还有一些其他功能,一些使用配置,一些不使用:
copies :: Int -> String -> String
copies n str = concat (replicate n str)
foo :: (Given Config) => Int -> String
foo n = copies (timesW n) (s given)
然后,您可以在不同的配置下运行计算give
:
main = do
print $ give (Config 5 "x") $ foo 3
print $ give (Config 2 "no") $ foo 4
这类似于:
全局定义
given :: Config
,除非您可以在同一程序中在多个配置下运行计算;将配置作为额外参数传递给每个函数,除非您避免显式接受配置并将其传递的麻烦,例如:
timesW cfg x = w cfg * x foo cfg n = copies (timesW cfg n) (s cfg)
使用
Reader
单子,但您不必将所有内容都提升为笨拙的单子或应用程序级别的语法,例如:timesW x = (*) <$> asks w <*> pure x foo n = copies <$> timesW n <*> asks s
完整的例子:
{-# LANGUAGE FlexibleContexts #-}
import Data.Reflection
data Config = Config { w :: Int, s :: String }
timesW :: (Given Config) => Int -> Int
timesW x = w given * x
copies :: Int -> String -> String
copies n str = concat (replicate n str)
foo :: (Given Config) => Int -> String
foo n = copies (timesW n) (s given)
main = do
print $ give (Config 5 "x") $ foo 3
print $ give (Config 2 "no") $ foo 4
推荐阅读
- ios - 处于“等待开发者发布”状态的 iOS 版本过期
- ruby-on-rails - 在视图中呈现结果不正确的 ActiveRecord
- python - 使用 Pandas DataFrame 从一个数据帧中获取唯一值及其出现到一个新数据帧中
- r - 如何使用“如何”功能进行不平衡的重复设计
- c++ - 我的程序在到达 `cin.getline()` 函数时突然退出
- rspec - Chefspec:覆盖属性不起作用
- javascript - 工作箱。为什么我的缓存存储是空的?我做错了什么?
- jquery - 计算克隆后每个表单行的总和
- javascript - 如何让我的 javascript 动画更快?
- php - Doctrine & Symfony - Get data from database with parameter on array column