小编Sve*_*cke的帖子

Rails:渲染集合部分:获取部分内部的集合大小

我有一个我想用部分渲染的项目集合:

@items = ['a','b','c']

<%= render :collection => @items, :partial => 'item' %>
Run Code Online (Sandbox Code Playgroud)

我想用升序数字对元素进行编号.所以输出应该是:

3: a
2: b
1: c
Run Code Online (Sandbox Code Playgroud)

我知道rails在partial中提供了一个计数器,所以如果我想对降序的项进行编号,我可以创建以下部分:

<%= item_counter %>: <%= item %>
Run Code Online (Sandbox Code Playgroud)

这给了我

1: a
2: b
3: c
Run Code Online (Sandbox Code Playgroud)

但是对于递增的数字,我需要项目的总数,我可以提供一个本地的部分:

<%= render :collection => @items, :partial => 'item', :locals => {:total => @items.size} %>
Run Code Online (Sandbox Code Playgroud)

然后在部分:

<%= total - item_counter %>: <%= item %>
Run Code Online (Sandbox Code Playgroud)

但是我感觉像重复一样,因为渲染方法已经知道了集合的大小.

除了使用局部变量之外,真的没有办法让集合中的项目总数达到局部吗?

ruby-on-rails

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

如何使用Rack为特定文件设置内容类型?

我想让Rack服务于具有特定内容类型的特定文件.它是一个.htc文件,需要作为text/x-component提供,以便IE识别它.在apache我会做

AddType text/x-component .htc
Run Code Online (Sandbox Code Playgroud)

我怎样才能通过Rack实现这一目标?目前该文件由Rack :: Static提供,但我没有找到设置内容类型的选项.

ruby internet-explorer rack file-type html-components

9
推荐指数
1
解决办法
2640
查看次数

如果它符合某些条件,则更改列表元素,否则使用Data.Lens添加新元素

我有一个记录列表,需要一个函数,在列表中搜索具有给定名称的记录并修改此记录的值,或者如果没有记录匹配,则将新记录附加到结果列表中.到目前为止,这是我的代码:

import Control.Lens
import Control.Applicative ((<$>), pure)
import Data.List (any)

data SomeRec = SomeRec { _name :: String, _val :: Int }
$(makeLenses ''SomeRec)

_find :: (a -> Bool) -> Simple Traversal [a] a
_find _ _ [] = pure []
_find pred f (a:as) = if pred a
                        then (: as) <$> f a
                        else (a:) <$> (_find pred f as)

changeOrCreate :: [SomeRec] -> String -> (Int -> Int) -> [SomeRec]
changeOrCreate recs nameToSearch valModifier = …
Run Code Online (Sandbox Code Playgroud)

haskell list lenses

8
推荐指数
1
解决办法
426
查看次数

连续monad中优雅的haskell案例/错误处理

因为我之前在其他问题上过于简单,所以我想在这里给出一个更清晰的例子.

如何在不嵌套多个案例的情况下处理必须以顺序方式检查certian条件的情况?使用"顺序方式"我的意思是获取一个值(例如来自stdin),检查该值是否适用于某个条件,并取决于获得另一个值的结果等等.

例:

sequen :: IO String
sequen = do
  a <- getLine
  case a of
    "hi" -> do
      putStrLn "hello!"
      b <- getLine
      case b of
        "how are you?" -> do
          putStrLn "fine, thanks"
          return "nice conversation"
        _ -> return "error 2"
    _ -> return "error 1"
Run Code Online (Sandbox Code Playgroud)

我知道有更好的方法来编写这样的聊天机器人,它应该只是展示问题的顺序性.正如您所看到的,对于每个嵌套的情况,代码也会缩进.

有没有办法更好地构建这样的代码?我正在考虑在一个地方处理"错误"并描述"成功路径"而不分配错误处理.

haskell

6
推荐指数
2
解决办法
1990
查看次数

优雅的 Haskell 案例/错误处理

我试图更好地理解如何处理 Haskell 中的错误情况,并编写了一些代码来帮助我解决这个问题。

有没有更好的方法(更优雅、更短、更通用)来处理多个替代方案(如嵌套 case 表达式)?关于该主题的任何不错的教程?

此示例的虚构类型。这有点简化,因为大多数情况下不仅有这些嵌套类型,而且还有只能按顺序检索的依赖值(例如,从 stdin 读取 id,然后从数据库中检索此 id 的记录)。因此,此处的嵌套应该演示一种情况,即只有在已检查外部值时内部值才可用Nothing。请参阅我的新问题以获得更好的示例。

type MyType = (Maybe (Maybe Int))
Run Code Online (Sandbox Code Playgroud)

目标

当 int 小于 10 时返回 int,在其他情况下(大于或等于 10,Nothing 或 Just Nothing)返回不同的错误消息。

process Nothing ~> "error"
process (Just Nothing) ~> "error2"
process (Just (Just 20)) ~> "error3"
process (Just (Just 5)) ~> "5"
Run Code Online (Sandbox Code Playgroud)

到目前为止尝试过:

幼稚的实施。

饱受“爬行压痕”之苦

process :: MyType -> String
process t = case t of
        Nothing -> "error"
        Just a -> case a of
                    Nothing -> …
Run Code Online (Sandbox Code Playgroud)

haskell

4
推荐指数
1
解决办法
865
查看次数

SQL:为最接近特定时间的每一天选择一条记录

我有一个表存储一个时间点的值:

CREATE TABLE values
(
    value DECIMAL,
    datetime DATETIME 
)
Run Code Online (Sandbox Code Playgroud)

每天可能有很多值,某一天也可能只有一个值.现在我想获得给定时间段(例如一个月)中每天最接近给定时间的值.如果有当天的记录,我只想每天获得一个值,如果没有记录,我只想获得没有值.我的数据库是PostgreSQL.我非常坚持这一点.我可以在时间跨度中获取所有值,并以编程方式为每一天选择最接近的值,但这意味着从数据库中提取大量数据,因为一天可能有很多值.

(更新)

为了使它更具抽象性:我有任意精度的数据(可能是一分钟,可能是两小时或两天),我想将它转换为一天的固定精度,具有一天的特定时间.

(第二次更新)

假设期望的时间是16:00,这是来自接受的答案的查询以及正确的postgresql类型转换:

SELECT datetime, value FROM values, (
  SELECT DATE(datetime) AS date, MIN(ABS(EXTRACT(EPOCH FROM TIME '16:00' - CAST(datetime AS TIME)))) AS timediff
  FROM values
  GROUP BY DATE(datetime)
  ) AS besttimes
WHERE 
CAST(values.datetime AS TIME) BETWEEN TIME '16:00' - CAST(besttimes.timediff::text || ' seconds' AS INTERVAL)
                                AND TIME '16:00' + CAST(besttimes.timediff::text || ' seconds' AS INTERVAL) 
                                AND DATE(values.datetime) = besttimes.date
Run Code Online (Sandbox Code Playgroud)

sql postgresql datetime

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

从具有相关值的函数中删除显式递归

我有以下Haskell函数,它使用显式递归:

f :: [a] -> [a]
f (a:b:xs) = g a b : f (g a b : xs)
  where
    g :: a -> a -> a
f (_:[])   = []
f []       = []
Run Code Online (Sandbox Code Playgroud)

请注意,递归调用取决于之前(by g)步骤中计算的值.

有没有办法删除显式递归,如果是,如何?

recursion haskell

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

使用自定义比较器函数压缩两个列表的标准方法

如果经常需要压缩两个列表,则丢弃不匹配的元素(通过比较列表元素的部分来定义"匹配").例如:

let as = [(1,"a"), (2,"b"), (4,"c")]
let bs = [(2,"a"), (3,"b"), (4,"c"), (5, "d")]
zipWithAdjust (fst) (fst) as bs
-- ~> [((2,"b"),(2,"a")), ((4,"c"),(4,"c"))]
Run Code Online (Sandbox Code Playgroud)

我实现zipWithAdjust如下:

zipWithAdjust :: (Ord c, Show a, Show b, Show c) => (a -> c) -> (b -> c) -> [a] -> [b] -> [(a,b)]
zipWithAdjust cmpValA cmpValB (a:as) (b:bs)
  | cmpValA a == cmpValB b = (a,b) : zipWithAdjust cmpValA cmpValB as bs
  | cmpValA a > cmpValB b = zipWithAdjust cmpValA cmpValB …
Run Code Online (Sandbox Code Playgroud)

haskell

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