小编luk*_*all的帖子

如何用aeson解析嵌套的JSON

我试图使用aeson解析以下形式的JSON

{"field":{"name":"..."}}

or

{"tag":{"name":"..."}}

or

{"line":{"number":"..."}}
Run Code Online (Sandbox Code Playgroud)

构造以下数据类型

data Rule = Line Integer
          | Field L.ByteString
          | Tag L.ByteString
Run Code Online (Sandbox Code Playgroud)

不幸的是,我面临两个我没有找到解决方案的问题,即:

  1. 如何解析嵌套的JSON?查看(.:)的实现,它使用lookup来提取特定键的值.我对做这样的事情犹豫不决,因为它似乎过分依赖于aeson如何实现事物的具体细节.我认为这是一个问题我错了吗?

  2. 如何根据JSON中存在的键使用正确的数据构造函数?我用<|>做的所有努力都让我无处可去.

我会发布到目前为止我写的代码,但我还没有达到我有什么值得发布的地步.

json haskell

14
推荐指数
2
解决办法
2305
查看次数

在Haskell中使用Maybe写一个最大Monoid

我一直在经历Haskell幺半群及其用途,这让我对幺半群的基本知识有了很好的理解.博客文章中介绍的一件事是Any monoid,它的用法如下:

foldMap (Any . (== 1)) tree
foldMap (All . (> 1)) [1,2,3]
Run Code Online (Sandbox Code Playgroud)

在类似的情况下,我一直在尝试构建一个最大的幺半群,并提出以下内容:

newtype Maximum a = Maximum { getMaximum :: Maybe a }
        deriving (Eq, Ord, Read, Show)

instance Ord a => Monoid (Maximum a) where
        mempty = Maximum Nothing
        m@(Maximum (Just x)) `mappend` Maximum Nothing = m
        Maximum Nothing `mappend` y = y
        m@(Maximum (Just x)) `mappend` n@(Maximum (Just y))
          | x > y = m
          | otherwise = n
Run Code Online (Sandbox Code Playgroud)

我可以为特定类型构造一个最大幺半群 - 例如Num,非常容易,但希望它对任何东西都有用(明显要求任何东西都是Ord的一个实例).

此时我的代码编译,但就是这样.如果我尝试运行它,我得到这个: …

haskell monoids

12
推荐指数
1
解决办法
1398
查看次数

如何以及为什么在Haskell中将ap定义为liftM2 id

在尝试更好地理解Applicative的同时,我查看了<*>的定义,该定义往往被定义为ap,后者又被定义为:

ap                :: (Monad m) => m (a -> b) -> m a -> m b
ap                =  liftM2 id
Run Code Online (Sandbox Code Playgroud)

查看liftM2和id的类型签名,即:

liftM2  :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
id                      :: a -> a
Run Code Online (Sandbox Code Playgroud)

我无法理解如何通过传递id,类型签名的相关部分似乎从转换(a1 -> a2 -> r) -> m a1m (a -> b).我在这里错过了什么?

haskell applicative

12
推荐指数
1
解决办法
1078
查看次数

适用(和朋友)方法是否有人性化的名称?

我最近一直在使用应用程序(和替代方案),令我感到沮丧的一件事是我缺乏对命名法的了解.作为一个例子,我希望能说function name的,而不是star thing<*>.因此,与>>=读取的方式大致相同bind,以下是否有更多人性化的名称:

  • <*> - 申请?
  • <*&*>- 左右适用?
  • <$> - fmap?
  • <|>

同样来自箭头

  • *** - 分裂?
  • &&& - 扇出?

如果有这些名称,我的搜索没有发现它们.我知道这些可能没有被接受的条款,但如果有,我很想知道它们.

haskell naming applicative

9
推荐指数
3
解决办法
510
查看次数

如何构建DSL以从Haskell中的记录中查找字段

TL; DR:我需要帮助弄清楚如何生成代码,这些代码将从不同记录的各个字段返回少量数据类型之一(可能只是Double和Bool).

长格式:假设以下数据类型

data Circle = Circle { radius :: Integer, origin :: Point }
data Square = Square { side  :: Integer }
Run Code Online (Sandbox Code Playgroud)

和一些样板代码

circle = Circle 3 (Point 0 0)
square = Square 5
Run Code Online (Sandbox Code Playgroud)

我正在构建一个小型DSL,并希望用户能够编写如下内容

circle.origin
square.side
Run Code Online (Sandbox Code Playgroud)

它会生成类似的代码

origin . circle
side . square
Run Code Online (Sandbox Code Playgroud)

在解析这个时,我会将字符串"circle"和"origin"作为例子.我现在需要把它们变成函数调用.我显然可以这样:

data Expr a = IntegerE (a -> Integer)
            | PointE (a -> Point)

lookupF2I "side"   = Just $ IntegerE side
lookupF2I "radius" = Just $ IntegerE radius
lookupF2I _        = Nothing …
Run Code Online (Sandbox Code Playgroud)

dsl haskell

7
推荐指数
1
解决办法
428
查看次数

从Haskell中的git packfile索引获取幻数

我想从git packfile索引中获取神奇的数字,以确保它确实是一个packfile.该包格式的文档指出,一个神奇的数字是"/ 377tOc".例如,当我用Ruby打开packfile时,我在阅读文件时得到了这个:

> File.open("pack-4412d2306cfe9a0b6d1b9b4430abc767022e8a3c.idx").read(4)
=> "\377tOc"
Run Code Online (Sandbox Code Playgroud)

但是在Haskell我得到了这个:

> h <- openFile "pack-4412d2306cfe9a0b6d1b9b4430abc767022e8a3c.idx" ReadMode
> Data.ByteString.hGet h 4
=> "\255tOc"
Run Code Online (Sandbox Code Playgroud)

我认为我错过了一些明显的东西,但我不清楚这是什么.我在这做错了什么?

git haskell bytestring

6
推荐指数
1
解决办法
278
查看次数

如何更改Vim用于在缓冲区中对空行进行编号的字符?

目前,当我的窗口大于显示的缓冲区时,空白行显示为行号列中的〜.通过空行我显然不是指缓冲区本身的空行,而是延伸到缓冲区末尾的行.

我更喜欢行号是空白的.这可能吗?

vim

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

具有静态类型长度的列表的写长度函数

给定一个静态类型长度的列表(以此为例):

data Zero

data Succ nat

data List el len where
    Nil  ::                      List el Zero
    Cons :: el -> List el len -> List el (Succ len)
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个长度函数,使用静态类型而不是通常的递归来计算长度?

到目前为止,我的努力使我得出的结论是,这是不可能的,因为它需要"解除"类型信息才能重现:

class HasLength a where
    length :: a -> Natural

instance HasLength (List el Zero) where
    length _ = 0

instance HasLength (List el (Succ len)) where
    length _ = 1 + *how to recur on type of len*
Run Code Online (Sandbox Code Playgroud)

然而,我只是刚刚开始了解所有类型的魔法,所以我知道我无法想象一个解决方案并不意味着没有一个.

更新

由于长度返回自然,我写错了length _ = 1 + ....正确的实例(使用下面给出的答案)是 …

haskell types

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

对于#<Class:0x17a6408> -rails-3,未定义的方法`to_key'

在多态上传的表单上,我遇到了未定义的方法`to_key'的问题.

这是部分形式:

<%= form_for [@parent, Upload], :html => { :multipart => true } do |f|  %>

  <div class="field">
    <%= f.label :document %><br />
    <%= f.file_field :document %>
  </div>

  <div class="actions">
    <%= f.submit "Upload"%>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这是控制器:

class UploadsController < ApplicationController
  before_filter :find_parent

  respond_to :html, :js

  def index
    @uploads = @parent.uploads.all unless @uploads.blank?
    respond_with([@parent, @uploads])
  end

  def new
    @upload = @parent.uploads.new unless @uploads.blank?
  end

  def show
    @upload = @parent.upload.find(params[:upload_id])
  end

  def create
    # Associate the correct MIME type for …
Run Code Online (Sandbox Code Playgroud)

methods undefined ruby-on-rails-3

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