首先,让代码说:
#[derive(Debug)]
struct Bar;
#[derive(Debug)]
struct Qux {
baz: bool
}
#[derive(Debug)]
struct Foo {
bars: Vec<Bar>,
qux: Qux,
}
impl Foo {
fn get_qux(&mut self) -> &mut Qux {
&mut self.qux
}
fn run(&mut self) {
// 1. Fails:
let mut qux = self.get_qux();
// 2. Works:
// let mut qux = &mut Qux { baz: false };
// 3. Works:
// let mut qux = &mut self.qux;
let qux_mut = &mut qux;
qux_mut.baz = true;
for bar in …Run Code Online (Sandbox Code Playgroud) 我进入Haskell,发现这本书"让你学习一个Haskell"最有帮助.我是关于applicative functors的部分.
正如书中所示,我对以下内容感到困惑:
(\x y z -> [x, y, z]) <$> (+3) <*> (*2) <*> (/2) $ 5
Run Code Online (Sandbox Code Playgroud)
产生输出:
[8.0,10.0,2.5]
Run Code Online (Sandbox Code Playgroud)
首先,我已经确认了我对ghci关于运算符优先级的怀疑,所以上面等于下面的丑陋声明:
(((\x y z -> [x,y,z]) <$> (+3)) <*> (*2) <*> (/2)) $ 5
Run Code Online (Sandbox Code Playgroud)
因此,很明显,首先发生的是fmap通过中(<$>)缀运算符调用.
而这正是令人难以置信的核心.fmap(这里显示为中缀(<$>))的定义是:
(<$>) :: (Functor f) => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
但在我正在努力的等式中,(\x y z -> [x, y, z])需要三个论点,而不仅仅是一个.那么类型的第一个参数怎么能(a -> b)满足呢?
我认为它可能与部分应用/ currying有关,但我无法弄明白.我非常感谢你的解释.希望我已经很好地提出了这个问题.
让我们首先为这个过于笼统的问题道歉,但由于缺乏对这里发生的事情的了解,我正在绞尽脑汁如何缩小范围,因此将根据评论/答案进行调整。
我在TypeScript Playground上创建了一个示例程序,该程序不应该编译,但可以编译(在撰写本文时使用最新版本的 TypeScript,v4.5.2)。我试图理解为什么会编译它,以便了解其他不良程序可能会溜过去类型检查器并且不会被发现。这是该程序的另一个版本,显示了运行时的问题。有没有我忽略的选项或者我可以做些什么来让这个程序不进行类型检查?
为了方便起见,我也在此处内联了相关程序:
type Settings = { 'a': boolean; 'b': string }
function setSetting<K extends keyof Settings>(p: K, v: Settings[K]): void {}
// setSetting('a', 100) // good; it fails
setSetting('a', true); // good; compiles
function breakSetSetting(k: keyof Settings, v: boolean): void {
setSetting(k, v);
}
breakSetSetting('b', true); // bad; it compiles!
Run Code Online (Sandbox Code Playgroud)
更新:根据@crashmstr的评论,使用泛型使breakSettings 程序无法编译,但是,我仍然不清楚为什么它之前被允许编译。
我定义如下模型,其中Category有一个非整数的主键code类型Text。
Category
code Text
Primary code
deriving Show Typeable
CategoryTreeNode
name Text
code CategoryId Maybe
lft Int MigrationOnly default=0
rgt Int MigrationOnly default=0
deriving Show Typeable
Run Code Online (Sandbox Code Playgroud)
对于没有定义的模型Primary,我可以使用toSqlKey将任意Int64s 转换为Key Category. 具有自定义主键的模型是否有等效功能?
applicative ×1
functor ×1
haskell ×1
immutability ×1
mutability ×1
persistent ×1
rust ×1
typescript ×1
yesod ×1