我试图使用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)
不幸的是,我面临两个我没有找到解决方案的问题,即:
如何解析嵌套的JSON?查看(.:)的实现,它使用lookup来提取特定键的值.我对做这样的事情犹豫不决,因为它似乎过分依赖于aeson如何实现事物的具体细节.我认为这是一个问题我错了吗?
如何根据JSON中存在的键使用正确的数据构造函数?我用<|>做的所有努力都让我无处可去.
我会发布到目前为止我写的代码,但我还没有达到我有什么值得发布的地步.
我一直在经历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的一个实例).
此时我的代码编译,但就是这样.如果我尝试运行它,我得到这个: …
在尝试更好地理解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 a1为m (a -> b).我在这里错过了什么?
我最近一直在使用应用程序(和替代方案),令我感到沮丧的一件事是我缺乏对命名法的了解.作为一个例子,我希望能说function name的,而不是star thing为<*>.因此,与>>=读取的方式大致相同bind,以下是否有更多人性化的名称:
<*> - 申请?<*&*>- 左右适用?<$> - fmap?<|>同样来自箭头
*** - 分裂?&&& - 扇出?如果有这些名称,我的搜索没有发现它们.我知道这些可能没有被接受的条款,但如果有,我很想知道它们.
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) 我想从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)
我认为我错过了一些明显的东西,但我不清楚这是什么.我在这做错了什么?
目前,当我的窗口大于显示的缓冲区时,空白行显示为行号列中的〜.通过空行我显然不是指缓冲区本身的空行,而是延伸到缓冲区末尾的行.
我更喜欢行号是空白的.这可能吗?
给定一个静态类型长度的列表(以此为例):
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 + ....正确的实例(使用下面给出的答案)是 …
在多态上传的表单上,我遇到了未定义的方法`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)