这是我之前的问题的后续行动.
我在阅读Let Over Lambda时想出了一个奇怪的对象方案,可以想到没有协议的优点,但想得到意见.我只是在探索高阶函数和封装的使用.
(defn new-person
"Construct a new Person object and return a Map of accessor methods."
[init-first-name init-last-name init-age]
(let [first-name (ref init-first-name)
last-name (ref init-last-name)
age (ref init-age)]
{:get-first-name #(@first-name)
:set-first-name #(dosync (ref-set first-name %1))
:get-last-name #(@last-name)
:set-last-name #(dosync (ref-set last-name %1))
:get-age #(@age)
:set-age #(dosync (ref-set age %1))}))
Run Code Online (Sandbox Code Playgroud)
我可以使用这样的对象:
(def fred (new-person "fred" "flintstone" 42))
Run Code Online (Sandbox Code Playgroud)
并以这种方式检索访问器方法:
(fred :get-age)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何调用访问器.
创建的对象是线程安全的,因为"实例"变量的所有变异都发生在STM中.
更新:新的和改进的版本:
(defn new-person
"Construct a new Person object and …
Run Code Online (Sandbox Code Playgroud) 我有一个类型的Scala值Option[Set[String]]
,我试图在集合filter
方法中使用:
val opt: Option[Set[String]] = ...
collection.filter {
value =>
opt match {
case Some(set) => set.contains(value)
case None => true
}
}
Run Code Online (Sandbox Code Playgroud)
如果opt
值是Some(...)
我想使用封闭Set
过滤集合,否则我想包括集合中的所有项目.
有没有更好的(更地道)的方式来使用Option
(map
,filter
,getOrElse
等)?
它opt
来自可选的命令行参数,其中包含要包含的术语列表.如果缺少命令行参数,则包括所有术语.
在Haskell代数数据类型中,在声明中具有常量值是否合法?换句话说,我可以定义这样的东西:
data HttpStatusCodes = BadRequest "Bad request" 400
| NotAuthorized "Not authorized" 401
| -- ...
Run Code Online (Sandbox Code Playgroud)
我试图从规范中弄清楚,但语法对我来说并不清楚.
Haskell是否有XML pull解析器(类似于Java StAX)?
我正在设想使用一个接受解析器的纯函数.我的函数将调用类似nextItem parser
的结果(和模式匹配StartElement
,EndElement
,Text
,EntityRef
,等),然后我的函数可以调用本身递归处理子元素等,构建一个私有数据结构,因为它遍历XML"树".
据我所知,pull-parsing应该比构造DOM的内部表示具有更好的性能,然后遍历它,尽管我不知道在惰性语言中这是否正确.
我有一个输入值列表
List[A]
Run Code Online (Sandbox Code Playgroud)
和一个功能
f(List[A]): Either[Failure, Success]
Run Code Online (Sandbox Code Playgroud)
我将该函数应用于列表的每个元素,从而产生一个List[Either[Failure, Success]]
.
我想检查列表,如果任何值失败,则返回第一个失败,否则返回成功列表.
我使用了以下模式:
val allValues = list.map(f(_))
if (allValues.exists(_.isLeft)) {
allValues.find(_.isLeft).get
} else {
allValues.collect {
case Right(result) => result
}
}
Run Code Online (Sandbox Code Playgroud)
和
val allValues = list.map(f(_))
val failures = allValues.collect { case Left(error) => error }
if (failures.nonEmpty) {
failures(0)
} else {
allValues.collect {
case Right(result) => result
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更简洁的方式来表达这种模式?
有时,我必须通过另一个函数进一步处理成功,再次使用相同的模式.例如
如何验证 Datomic 实体 ID 是否有效?
我正在使用 Scala 和 Datomisca,但任何测试可能也适用于 Clojure 和 Datomic。
我正在考虑使用
connection.database.entity(id).toMap.nonEmpty
Run Code Online (Sandbox Code Playgroud)
假设一个有效的实体至少有一个属性。
有没有更好、更安全的方法来做到这一点?
在mongoose.d.ts
“DefinitelyTyped”文件中,该geoNear
函数有两个重载:
geoNear(point: { type: string; coordinates: number[] }, options: Object, callback?: (err: any, res: T[]) => void): Query<T[]>;
geoNear(point: number[], options: Object, callback?: (err: any, res: T[]) => void): Query<T[]>;
Run Code Online (Sandbox Code Playgroud)
我已经定义point
为
const point = { type: "Point", coordinates: [lng, lat] }
Run Code Online (Sandbox Code Playgroud)
wherelng
和lat
都是number
s,但是当我用这个调用它时:
Location.geoNear(point, {
spherical: true,
maxDistance: theEarth.getRadiansFromDistance(maxDistance),
num: 10
}, (err, results, stats) => {
var locations = []
results.forEach((doc: any) => {
locations.push({
distance: theEarth.getDistanceFromRadians(doc.dis),
name: …
Run Code Online (Sandbox Code Playgroud) 我有一个Scala案例类
case class NumericParam(minValue: Option[Int] = None,
maxValue: Option[Int] = None,
decimalPlaces: Option[Int] = None,
signed: Option[Boolean] = None,
hintText: Option[String] = None)
Run Code Online (Sandbox Code Playgroud)
和它的伴侣对象,我定义了一个隐式writes
方法
object NumericParam {
implicit val writes = new Writes[NumericParam] {
override def writes(value: NumericParam): JsValue = {
Json.obj(
"dataType" -> "Numeric",
"minValue" -> value.maxValue,
"maxValue" -> value.maxValue,
"decimalPlaces" -> value.decimalPlaces,
"signed" -> value.signed,
"hintText" -> value.hintText
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在添加该字段dataType
.有没有办法使用宏派生Writes
值(从Json.writes[NumericParam]
)并只添加额外的dataType
字段?
在答案/sf/answers/2217093441/中,图像拉伸以填充弹性盒网格中的“单元格”。
当我用按钮尝试时,它们没有。
grid-row {
display: flex;
width: 100%;
}
.narrow {
flex-grow: 1;
}
.wide {
flex-grow: 2;
}
.grid {
width: 300px;
height: 300px;
}
.grid button {
width: 100%;
height: auto;
vertical-align: middle;
flex-shrink: 1;
padding: 1px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
<div class="grid-row">
<button class="wide">1</button>
<button class="narrow">2</button>
<button class="narrow">3</button>
</div>
<div class="grid-row">
<button class="narrow">4</button>
<button class="wide">5</button>
<button class="narrow">6</button>
</div>
<div class="grid-row">
<button class="narrow">7</button>
<button class="narrow">8</button>
<button class="wide">9</button>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我理解使用"普通"函数,我可以从where
子句中定义的函数中访问顶层的参数.但是,当我尝试使用monadic函数时,我遇到编译时错误.
这有效:
module Main where
import Control.Monad.ST (ST, runST)
import Data.Array.ST (STUArray, newArray, readArray)
main :: IO ()
main = do
print $ runST $ do
arr <- newArray (0, 9) 0
checkArr arr
return ()
checkArr :: STUArray s Int Int -> ST s Bool
checkArr arr = do
val <- readArr arr
return $ val == 0
where
readArr :: STUArray s Int Int -> ST s Int
readArr arr = readArray arr 0
Run Code Online (Sandbox Code Playgroud)
但这不是:
module …
Run Code Online (Sandbox Code Playgroud)