小编Ric*_*ton的帖子

访问函数中的环境

main我可以读取我的配置文件,并提供它runReader (somefunc) myEnv就好了.但是somefunc不需要访问myEnv读卡器耗材,也不需要链接中的下一对.需要来自myEnv的功能是一个很小的叶子功能.

如何在不标记所有干预功能的情况下访问函数中的环境(Reader Env)?这可能不对,因为否则你只是首先传递myEnv.通过多个级别的函数传递未使用的参数只是丑陋(不是吗?).

我可以在网上找到很多例子,但它们似乎在runReader和访问环境之间只有一个级别.


我接受克里斯泰勒的,因为它是最彻底的,我可以看到它对其他人有用.还要感谢Heatsink,他是唯一一个试图直接回答我问题的人.

对于有问题的测试应用程序,我可能只是放弃了阅读器并传递环境.它不会给我任何东西.

我必须说我仍然感到困惑的是,为函数h提供静态数据不仅改变了它的类型签名,还改变了调用它的g和调用g的f.即使所涉及的实际类型和计​​算没有改变,所有这些都是如此.似乎实现细节在整个代码中泄漏,没有真正的好处.

haskell

11
推荐指数
2
解决办法
1202
查看次数

关于记录全局命名空间的当前最佳实践

我正在检查目前没有一些模板 - 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个扩展仅用于假记录命名空间).

haskell

5
推荐指数
2
解决办法
801
查看次数

将单个标签提取为日志面板中的列

我刚刚开始探索 Loki 来汇总我的日志,我假设我错过了一些明显的东西。

我有一堆机器/虚拟机/容器,带有 promtail 将 systemd 的日志转发到单个 loki 服务器(只是默认示例配置),我可以很好地探索它们。我可以根据需要按任何标签过滤日志。

然而,在仪表板面板上,我尝试了“表”和“日志”面板类型,但似乎无法完成对我来说极其基本的操作。我想按一些标签进行过滤,然后提取一个或多个剩余标签作为要显示的列。我发现的最接近的是在“日志”面板类型中打开“唯一标签”,它只是将一列中的所有值放在一起。

我错过了什么?

grafana-loki

5
推荐指数
1
解决办法
5836
查看次数

导入合格为无 - 不是错误

这对于为下一个可怜的树液添加一些可搜索的东西同样多,但我有兴趣知道它为什么不是错误.

我需要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

3
推荐指数
1
解决办法
181
查看次数

Snap框架 - 重复可能整理

我正在将我的(有限的)Haskell知识应用于Snap Web框架并查看我可以构建的内容.我正在尝试获取(可能不存在的)参数并将其解析为int.显然,"也许"是我想要的.

在下面的代码中AppHandler定义为Handler App App(我认为有一个具有两级状态的monad,虽然我现在在教程中找不到任何内容).该B8IS ByteString.Char8readInt回报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)

haskell maybe haskell-snap-framework

3
推荐指数
1
解决办法
288
查看次数

类型类实例可发现性 - 如何搜索?

示例 - Data.List具有为Data.Foldable定义的实例,但它在Foldable中定义,而不是在List中(而不是"[]"而不是"List").

对于实例与类型本身在同一文件中定义的情况(例如Data.Sequence),它在文档中列出.例如,我对Hoogle或Hayoo没有任何好运.

虽然我可以看到最常见的事件是具有数据类型定义的实例定义,但是有时必须将它放在单独的文件中.我刚碰巧选择了一个使用Data.List的错误示例,还是我在搜索技能中遗漏了一些东西?


澄清:我已经了解可折叠和列表,并且期望每个人在探索Haskell时很早就遇到过这个问题是合理的.然而,对于某些复杂类型的T来自例如Snap/Yesod /镜头,我不太可能知道我从未遇到的一些更复杂的类型类是相关的.我想知道是否有某种方式明确搜索实例,因为它们没有在类型的文件中定义(可以在类型的自动生成的文档中获取它).

haskell

2
推荐指数
1
解决办法
145
查看次数