我有一个我想用部分渲染的项目集合:
@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)
但是我感觉像重复一样,因为渲染方法已经知道了集合的大小.
除了使用局部变量之外,真的没有办法让集合中的项目总数达到局部吗?
我想让Rack服务于具有特定内容类型的特定文件.它是一个.htc文件,需要作为text/x-component提供,以便IE识别它.在apache我会做
AddType text/x-component .htc
Run Code Online (Sandbox Code Playgroud)
我怎样才能通过Rack实现这一目标?目前该文件由Rack :: Static提供,但我没有找到设置内容类型的选项.
我有一个记录列表,需要一个函数,在列表中搜索具有给定名称的记录并修改此记录的值,或者如果没有记录匹配,则将新记录附加到结果列表中.到目前为止,这是我的代码:
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) 因为我之前在其他问题上过于简单,所以我想在这里给出一个更清晰的例子.
如何在不嵌套多个案例的情况下处理必须以顺序方式检查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 中的错误情况,并编写了一些代码来帮助我解决这个问题。
有没有更好的方法(更优雅、更短、更通用)来处理多个替代方案(如嵌套 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) 我有一个表存储一个时间点的值:
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) 我有以下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
)步骤中计算的值.
有没有办法删除显式递归,如果是,如何?
如果经常需要压缩两个列表,则丢弃不匹配的元素(通过比较列表元素的部分来定义"匹配").例如:
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)