我尝试编写一个图像验证格式,确保url以.png,.jpg或.gif结尾.
class Product < ActiveRecord::Base
mount_uploader :image_url
validates :title, :presence => true,
:uniqueness => true
validates :image_url, :presence => true,
:format => {
:with => %r{\.(gif|jpg|png)$}i,
:message => 'must be a URL for GIF, JPG or PNG image.'
}
end
Run Code Online (Sandbox Code Playgroud)
但是,当我启动我的服务器.看到这个:
提供的正则表达式使用多行锚点(^或$),这可能会带来安全风险.你的意思是使用\ A和\ z,还是忘了添加:multiline => true选项?
Just (+) <*> Just 3 <*> Just 5
Run Code Online (Sandbox Code Playgroud)
只是8
pure (+) <*> Just 3 <*> Just 5
Run Code Online (Sandbox Code Playgroud)
只是8
pure (*3) <*> [0..10]
Run Code Online (Sandbox Code Playgroud)
[0,3,6,9,12,15,18,21,24,27,30]
Just (*3) <*> [0..10]
Run Code Online (Sandbox Code Playgroud)
无法将类型'[]'与'Maybe'匹配
预期类型:也许b
实际类型:[b]
在'(<*>)'的第二个参数中,即'[0 ... 10]'
在表达式中:Just(*3)<*> [0 .. 10]
在'it'的等式中:it = Just(*3)<*> [0 ... 10]
如果是pure和Just互换,它们有什么不同的时候?
如果我有三个数据类型命名Expr,Op并Fu像这样.
data Expr = Num Double
| X
| Operator Op Expr Expr
| Function Fu Expr
deriving (Eq)
data Op = Add | Mul
deriving (Eq)
data Fu = Sin | Cos
deriving (Eq)
Run Code Online (Sandbox Code Playgroud)
我应该做的是稍后根据数据类型创建一个表达式.例如
let anExpr = Add (Num 3.0) (Num 4.0)
Run Code Online (Sandbox Code Playgroud)
而且打印出相应的表达式,在这种情况下它应该只是"3.0 + 4.0".
我面临的问题是创建另一种类型或数据类型来识别它是否应该打印出来的加法或乘法符号.我想做的是在伪代码中这样的事情
printOut (Num n) = show n
printOut X = "x"
printOut (Op a b) = printOut a ++ 'printOutRightOp' ++ printOut b
printOut (Fu a) = …Run Code Online (Sandbox Code Playgroud) 我试图在我的程序中有条件地编译一个子模块,以在发布版本和开发版本之间切换代码的一小部分。
目前我正在尝试使用cpphs但是当我更改传递给 GHC 的标志以定义变量并更改 ifdef 语句堆栈时,不会重新编译这些文件。
例如,我有一个端口号,我想根据我构建的目标进行切换。我定义这个数字的代码看起来像这样。
#ifdef StableRelease
port = 12345
#else
port = 54321
#endif
Run Code Online (Sandbox Code Playgroud)
稳定版本的 cabal 文件中有以下选项
ghc-options: -threaded -rtsopts -with-rtsopts=-N -pgmP cpphs -optP "-DStableRelease"
Run Code Online (Sandbox Code Playgroud)
当我运行时,stack build它似乎并没有真正预处理上面的代码。有没有人有使用 cpphs 或其他预处理解决方案的经验?
我有一个在neo4j网络浏览器中运行的查询:
MATCH p=(z)<-[*]-(a)-[:foo]->(b) WHERE b.value = "bar" return p
Run Code Online (Sandbox Code Playgroud)
这返回了大量连接的节点.发生的事情似乎已经删除了所有这些节点(在一个单独的事件中),但我仍然有旧查询的输出.浏览器的代码部分列出了响应数据:
...
"graph": {
"nodes": [
{
"id": "1148578",
"labels": [
"text"
],
"properties": {
"value": "bar",
"timestamp": 1478747946867
}
},
...
Run Code Online (Sandbox Code Playgroud)
有没有办法让我从旧查询的输出中重新创建所有这些数据?
这个最近的问题让我想到了Haskell使用无限列表的能力.有大量 的 其他问题,并约在计算器上无限列表答案,我明白了为什么我们不能对所有无限列表的通用解决方案,但为什么不能哈斯克尔推理一些无限列表?
让我们使用第一个链接问题中的示例:
list1 = [1..]
list2 = [x | x <- list1, x <= 4]
print list2
$ [1,2,3,4
Run Code Online (Sandbox Code Playgroud)
@ user2297560在评论中写道:
假装你是GHCI.您的用户会为您提供无限列表,并要求您查找该列表中小于或等于4的所有值.您将如何进行此操作?(请记住,您不知道列表是否有序.)
在这种情况下,用户没有给你一个无限的列表.GHC产生了它!实际上,它是按照自己的规则生成的.该哈斯克尔2010标准规定如下:
enumFrom :: a -> [a] -- [n..]
Run Code Online (Sandbox Code Playgroud)
对于Int和Integer类型,枚举函数具有以下含义:
- 序列enumFrom
e1是列表[e1,e1+ 1,e1+ 2,...].
在他对另一个问题的回答中,@ chepner写道:
你知道列表是单调递增的,但Haskell没有.
这些用户所做的陈述似乎与我的标准不符.Haskell使用单调增加以有序的方式创建了列表.Haskell 应该知道列表是有序的和单调的.那么为什么不能将这个无限列表自动[x | x <- list1, x <= 4]转化takeWhile (<= 4) list1呢?
我有一个简单的条件检查,看看一个对象(称为模型)是否与另一个对象(称为关联)有一个has_many关联.
if model.respond_to? association.pluralize.to_s && !model.send(association.pluralize).nil?
puts "Hello World"
end
Run Code Online (Sandbox Code Playgroud)
每次调用此检查时,rails都会undefined method在模型上为该关联抛出一个.
在控制台中调试时,我试图分开代码失败的地方.
if model.respond_to? association.pluralize.to_s
puts "Hello World"
end
Run Code Online (Sandbox Code Playgroud)
通过删除条件的后半部分,它会停止失败(并且不会按预期打印).也model.respond_to? association.pluralize.to_s直接检查,总是返回false.
所以我又试了一次:
if false && !model.send(association.pluralize).nil?
puts "Hello World"
end
Run Code Online (Sandbox Code Playgroud)
这样工作正常,没有任何错误,也没有打印(我想要).
那么为什么在第一组代码中,条件不短路呢?第一部分总是返回false,但是后半部分仍然被评估导致NoMethodError.是否有一些"陷阱" respond_to?或send导致这种情况?还是更简单的东西?任何帮助都会非常感谢!
我与一些HTTP代码工作并获得当我建立(使用编译器警告stack build),警告重叠的图案在我的案件处理不同的HTTP响应相匹配.我正在使用这些包裹
import Network.HTTP.Types.Status (ok200, status203, Status)
import Network.HTTP.Conduit
import Network.HTTP.Types.Header
Run Code Online (Sandbox Code Playgroud)
有问题的代码是:
... -- setup stuff for other functions.
-- getHttpResponse just uses "httpLbs req mngr" with some additional error wrapping
resp <- liftIO $ getHttpResponse mngr req
case resp of
Nothing -> ExceptT $ return $ Left $ create $ "could not get a response from " <> uri
Just r -> case responseStatus r of
ok200 -> do
case decode (responseBody r) of
Nothing -> throwIOError …Run Code Online (Sandbox Code Playgroud) 我正在处理来自REST服务器的一些格式复杂的JSON响应。为了解码它们,我有几种数据类型来处理不同的嵌套对象。例如:
... Other types ...
data Profile =
Profile { fields :: [KVPair]
} deriving (Show)
instance FromJSON Profile where
parseJSON (Object v) =
Profile <$> v .: "Fields"
parseJSON _ = mzero
data KVPair =
KVPair { key :: Int
, value :: String
} deriving (Show)
instance FromJSON KVPair where
parseJSON (Object v) =
KVPair <$> v .: "Key"
<*> v .: "Value"
parseJSON _ = mzero
Run Code Online (Sandbox Code Playgroud)
除最终的KVPair类型外,其他所有功能均可用。我的JSON对象都具有整数键;但是,值可以是整数或字符串:
{
"Key": 0,
"Value": "String Value!"
},
{
"Key": 1, …Run Code Online (Sandbox Code Playgroud) 我有一种感觉,这是不可能的,但我会喜欢一些输入,看看是否有一些我缺少的扩展或技术.
我有一个类型类的通用实例,它定义了一些默认方法:
class TestClass a where
foo :: a -> Maybe Text
bar :: a -> [Int]
instance TestClass a where
foo _ = Nothing
bar _ = []
data SpecificType = SomeValue | OtherValue
instance TestClass SpecificType where
foo SomeValue = Just "Success"
foo OtherValue = Just "Other Success"
Run Code Online (Sandbox Code Playgroud)
我相信这已经需要OverlappingInstances,但问题是TestClassfor 的实例SpecificType没有实现bar.我只想声明第二个实例的一部分,并使用其余的默认实现.有没有办法实现这个目标?
我有一个格式如下的字符串:
project-version-project_test-type-other_info-other_info.file_type
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我可以从这个字符串中删除大部分需要的信息.当我的版本中有一个额外的限定字符时(即通常是5个字符,但有时会添加第6个字符),我的麻烦就出现了.
以前,我使用子字符串来删除多余的信息并获得'project_test-type'但是,现在我需要切换到正则表达式(主要用于处理额外的版本字符).我可以继续使用子串并根据我是否有额外的版本字符来改变长度,但正则表达式似乎更合适.
我尝试过使用以下模式:
my ($type) = $_ =~ /.*-.*-(.*)-.*/;
Run Code Online (Sandbox Code Playgroud)
但是'project_test-type'中的额外' - '意味着我不能简单地使用该字符来填充我的正则表达式.
我可以用什么正则表达式从我的字符串中获取'project_test-type'?
更多信息:作为一个更具人类可读性的示例,信息按以下方式分组:
project - version - project_test-type - other_info - other_info . file_type
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更好的方法来检查给定类型的所有值是否相等.
例如,考虑:
data Foo = Foo {a :: Int, b :: Int, c :: Int, d :: Int}
allFooEqual :: Foo -> Bool
allFooEqual foo = (a foo == b foo) && (a foo == c foo) && (a foo == d foo)
Run Code Online (Sandbox Code Playgroud)
这可行,但它不是一个可扩展的解决方案.有没有更惯用的方式来执行我所缺少的这种行为?
我有一个带有 10 个String参数的函数,在一些重构过程中,部分代码发生了变化,所以现在这些参数Text在调用函数时结束:
fxn :: String -> ... -> IO (Int, String)
fxn a b c d e f g h i j = do something
...
-- Get parameters for fxn
let a = "blah" :: Text
...
fxn a b c ...
Run Code Online (Sandbox Code Playgroud)
理想情况下,我可以重构所有代码以使用Text,但目前这很乏味且不理想。我还可以轻松地将 a 添加T.unpack到我获取函数参数的位置:
let a = T.unpack ("blah" :: Text)
Run Code Online (Sandbox Code Playgroud)
但同样,这不是理想的,因为对于大量参数,这种情况发生在几个不同的地方,我更愿意保持代码简洁,而不是T.unpack到处都有几十个语句。
haskell 中是否有一种方法可以组合函数以使参数变形,例如(fxn . T.unpack) a b c ...,或者将解包函数应用于 f 函数的每个参数?这似乎是一个简单的组合问题,但我一直无法找到解决方案。