假设我有这样的GADT:
data Term a where
Lit :: a -> Term a
Succ :: Term Int -> Term Int
IsZero :: Term Int -> Term Bool
If :: Term Bool -> Term a -> Term a -> Term a
Run Code Online (Sandbox Code Playgroud)
是否有可能存储Succ (Lit 2)和IsZero (Succ (Lit 2))国家单子变压器内部,作为内部状态的值?
这里的问题是这两个是不同类型的,我不知道应该如何键入sof StateT s m a。
编辑:ATerm解决了如何GADT在状态中存储不同状态的最初问题,现在的问题是由于类型丢失了,因此似乎无法比较新旧状态。
编辑:最终答案。
在使用@luqui来回切换之后,下面是完整的代码片段,可以回答这个问题。
随意分叉此repl并尝试。
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}
import Data.Typeable
data Term a where …Run Code Online (Sandbox Code Playgroud) 我有一个简单的结构和它的两个实例,如下所示:
#[derive(Debug)]
struct User {
first: String,
last: String,
age: u32,
}
let u1 = User {
first: String::from("John"),
last: String::from("Doe"),
age: 22,
};
let u2 = User {
first: String::from("Mary"),
..u1
};
println!("user: {:#?}", u1);
Run Code Online (Sandbox Code Playgroud)
错误信息:
#[derive(Debug)]
struct User {
first: String,
last: String,
age: u32,
}
let u1 = User {
first: String::from("John"),
last: String::from("Doe"),
age: 22,
};
let u2 = User {
first: String::from("Mary"),
..u1
};
println!("user: {:#?}", u1);
Run Code Online (Sandbox Code Playgroud)
我试图修改它以..&u1希望它能够通过借用检查,以便我可以将基本结构(u1)传播到 u2,但无济于事,想知道我想在这里做什么?
我知道这是因为u1.lastis a …
我正在通过以下代码示例,发现很难弄清楚如何使用( - >)和(Star f)一旦他们实现'first'并成为Cartisian的成员.
有人可以提供一些容易理解的例子吗?谢谢.
-- Intuitively a profunctor is cartesian if it can pass around additional
-- context in the form of a pair.
class Profunctor p => Cartesian p where
first :: p a b -> p (a, c) (b, c)
first = dimap swapP swapP . second
second :: p a b -> p (c, a) (c, b)
second = dimap swapP swapP . first
instance Cartesian (->) where
first :: (a -> b) -> (a, c) …Run Code Online (Sandbox Code Playgroud) 想知道是否在Haskell中遵循代码?
equal :: a -> b -> Bool
equal a b = a == b
Run Code Online (Sandbox Code Playgroud)