在main我可以读取我的配置文件,并提供它runReader (somefunc) myEnv就好了.但是somefunc不需要访问myEnv读卡器耗材,也不需要链接中的下一对.需要来自myEnv的功能是一个很小的叶子功能.
如何在不标记所有干预功能的情况下访问函数中的环境(Reader Env)?这可能不对,因为否则你只是首先传递myEnv.通过多个级别的函数传递未使用的参数只是丑陋(不是吗?).
我可以在网上找到很多例子,但它们似乎在runReader和访问环境之间只有一个级别.
我接受克里斯泰勒的,因为它是最彻底的,我可以看到它对其他人有用.还要感谢Heatsink,他是唯一一个试图直接回答我问题的人.
对于有问题的测试应用程序,我可能只是放弃了阅读器并传递环境.它不会给我任何东西.
我必须说我仍然感到困惑的是,为函数h提供静态数据不仅改变了它的类型签名,还改变了调用它的g和调用g的f.即使所涉及的实际类型和计算没有改变,所有这些都是如此.似乎实现细节在整个代码中泄漏,没有真正的好处.
我正在检查目前没有一些模板 - haskell /一些镜头的优点来处理简单的情况:
data Person = Person {
name :: String,
...
}
data Company = Company {
name :: String,
...
}
Run Code Online (Sandbox Code Playgroud)
目前我通过限定导入来避免污染全局命名空间,但它确实使记录访问变得笨拙.
import Person as P
isFred :: Person -> Bool
isFred p = (P.name p) == "Fred"
Run Code Online (Sandbox Code Playgroud)
是否真的还没有更好的方式来访问记录字段?
我接受了@Emmanuel Touzery的答案,因为它与另一个覆盖同一理由的问题有用.另一个问题没有显示在"haskell名称空间"上的搜索.其他答案没有错,但我只能接受.
这里提到的解决方案使用模板Haskell,镜头,类型等等,基本上为每个字段"HasName"创建一个类型类,其中包含单个函数"name".然后,每个数据类型都是具有自己的实现的该类的实例.然后有一些魔法,我不完全理解允许涉及不同的类型.
对于任何想知道这是什么的Haskell新手来说,这是因为记录基本上是元组,字段选择器实现为普通函数选择(例如)该元组的第二个元素.如果您导出这些字段选择器函数,那么它们将位于全局命名空间中,迟早(通常更早)会发生冲突.
所以 - 您要么限定导入(如上面的示例所示),要么尝试提出不冲突的名称(名称前缀并希望最好).
镜头的东西在2013年风靡一时,可以选择现场选择器/吸气器+定位器等.镜头的基本概念并不太复杂,但实现方式正好在我脑海中.
为了记录(哈哈!)我认为另一篇文章中的解决方案可能就是我所追求的,但它确实涉及大量的魔法(5个扩展仅用于假记录命名空间).
我刚刚开始探索 Loki 来汇总我的日志,我假设我错过了一些明显的东西。
我有一堆机器/虚拟机/容器,带有 promtail 将 systemd 的日志转发到单个 loki 服务器(只是默认示例配置),我可以很好地探索它们。我可以根据需要按任何标签过滤日志。
然而,在仪表板面板上,我尝试了“表”和“日志”面板类型,但似乎无法完成对我来说极其基本的操作。我想按一些标签进行过滤,然后提取一个或多个剩余标签作为要显示的列。我发现的最接近的是在“日志”面板类型中打开“唯一标签”,它只是将一列中的所有值放在一起。
我错过了什么?
这对于为下一个可怜的树液添加一些可搜索的东西同样多,但我有兴趣知道它为什么不是错误.
我需要postgresql-simple中的FromRow类型类,但忘了它在自己的包中.
import qualified Database.Postgresql.Simple as P
Run Code Online (Sandbox Code Playgroud)
哎呀 - 只想要.FromRow子模块
import qualified Database.Postgresql.Simple.FromRow
Run Code Online (Sandbox Code Playgroud)
当然,不需要它合格,所以剥掉了名字.但是,我忘了删除"qualified"关键字.
因为我没有发现拼写错误,所以会产生错误,而且会让我头疼不已:
Not in scope: type constructor or class `FromRow'
Perhaps you meant `Database.PostgreSQL.Simple.FromRow.FromRow' (imported from Database.PostgreSQL.Simple.FromRow)
Run Code Online (Sandbox Code Playgroud)
所以 - 这是一个问题,为什么一个未命名的合格导入不是错误?对某些事情有用吗,或者我是第一个犯这个错误的傻人?
我正在将我的(有限的)Haskell知识应用于Snap Web框架并查看我可以构建的内容.我正在尝试获取(可能不存在的)参数并将其解析为int.显然,"也许"是我想要的.
在下面的代码中AppHandler定义为Handler App App(我认为有一个具有两级状态的monad,虽然我现在在教程中找不到任何内容).该B8IS ByteString.Char8和readInt回报Maybe(Int,ByteString)
下面的代码有效,但可能应该有一种方法可以将可能的调用链接在一起(通过MaybeT可能,因为我已经在Monad中了).链接特别有意义,因为下一步将基于解析的id从数据库中获取一行,所以当然也会返回"Maybe a".显然,这是一种非常普遍的模式.
-- Given a parameter name, return the Int it points to
-- or Nothing if there is some problem
maybeIntParam :: ByteString -> AppHandler (Maybe Int)
maybeIntParam pname = do
raw_param <- getParam pname
let mb_i_b = maybe (Nothing) B8.readInt raw_param
case mb_i_b of
Nothing -> return Nothing
Just (p,_) -> return $ Just p
Run Code Online (Sandbox Code Playgroud)
我尝试应用runMaybeT,但没有真正了解哪些类型需要坦率地改变我正在进行随机更改,希望错误消失.它没有,虽然它改变了并且从一行到另一行移动.
我认为这是进步,因为我现在完全失去了比我开始探索Haskell时更高的水平......
编辑:走过kosmikus的回答,希望我已经理解了......
1 …Run Code Online (Sandbox Code Playgroud) 示例 - Data.List具有为Data.Foldable定义的实例,但它在Foldable中定义,而不是在List中(而不是"[]"而不是"List").
对于实例与类型本身在同一文件中定义的情况(例如Data.Sequence),它在文档中列出.例如,我对Hoogle或Hayoo没有任何好运.
虽然我可以看到最常见的事件是具有数据类型定义的实例定义,但是有时必须将它放在单独的文件中.我刚碰巧选择了一个使用Data.List的错误示例,还是我在搜索技能中遗漏了一些东西?
澄清:我已经了解可折叠和列表,并且期望每个人在探索Haskell时很早就遇到过这个问题是合理的.然而,对于某些复杂类型的T来自例如Snap/Yesod /镜头,我不太可能知道我从未遇到的一些更复杂的类型类是相关的.我想知道是否有某种方式明确搜索实例,因为它们没有在类型的文件中定义(可以在类型的自动生成的文档中获取它).