小编Fel*_*ter的帖子

不能将`self.x`借用为不可变因为`*self`也被借用为可变的

首先,让代码说:

#[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)

immutability mutability rust

15
推荐指数
1
解决办法
5301
查看次数

应用仿函数:为什么fmap可以使用多个参数的函数?

我进入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有关,但我无法弄明白.我非常感谢你的解释.希望我已经很好地提出了这个问题.

haskell functor applicative

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

为什么这个 TypeScript 程序可以编译?

让我们首先为这个过于笼统的问题道歉,但由于缺乏对这里发生的事情的了解,我正在绞尽脑汁如何缩小范围,因此将根据评论/答案进行调整。

我在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 程序无法编译,但是,我仍然不清楚为什么它之前被允许编译。

typescript

6
推荐指数
1
解决办法
94
查看次数

用于自定义主键的持久性 `toSqlKey`

我定义如下模型,其中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. 具有自定义主键的模型是否有等效功能?

persistent yesod

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