我有一个简单的算术表达式数据结构,我希望能够打印。这里为了简单起见,我做了一个例子,其中包含 3 个二元运算,即加法、乘法和除法。定义如下所示:
module ExprPrint where
import Text.Printf
data Expr = Lit Int
| Add Expr Expr
| Mul Expr Expr
| Div Expr Expr
instance Show Expr where
show (Lit x) = show x
show (Add e1 e2) = printf "(%s) + (%s)" (show e1) (show e2)
show (Mul e1 e2) = printf "(%s) * (%s)" (show e1) (show e2)
show (Div e1 e2) = printf "(%s) / (%s)" (show e1) (show e2)
Run Code Online (Sandbox Code Playgroud)
我的目标是在删除所有多余括号的同时打印数据结构。当然,我上面实现的天真显示功能包括太多了。所以我想要做的是让Show实例考虑操作的优先级(Div和Mul …
我有一个 json web 密钥(https://tools.ietf.org/html/draft-ietf-jose-json-web-key-41),我想用它来用私钥对一些数据进行签名,然后稍后用公钥验证它。我在 .net framework 4.5.1 中使用 c#,我似乎无法使用我拥有的键正确实例化类。我使用这个工具生成了密钥:https : //github.com/mitreid-connect/json-web-key-generator。以下 json 可用,由此我应该能够签名和验证:
{
"kty": "RSA",
"d": "rZ_cdME7usL5EavJW1q0cjz8dhfdO9P-E4dacHYFf4I-TN7o-Q0ksfWCb4fpQPghUoz6v2b6-m3IZk4CocmdEAoFH2JqI0PbH5HIBqgva-bE8-elNJIKwza0Hbrw13bRU6KgpOrc9hrX-NcRCTkeKHYtDWGUa2NDB_lNQvkyg-V0NVXf5oSa_cZ9_H4kHPXrzcBeQapn2M_CFb3qfYgVgQb5xU5n67eAcSlztWHIaSaLyu_YAR0SxnEAvWiik1rtSYrEOWsVrPHfHBFwVHluP0g--bedH6kI3mZRI6H_UbmTMnRtxBkCA5mVdzOmsyX2e98MUqIlOeDQ4zB21xSDQQ",
"e": "AQAB",
"use": "sig",
"alg": "RS512",
"n": "xwHPJaSvKvLqrqb6oeXDL3A4iNgRo5PEQOQCE5zGa6ZWeoC88IuJZxXFJ93wzJk0J22QZJWofC8vV8GAeB3d9mD25koh0dbtb0yoWK-ttWamMIAN4WPiZu30JWzxY1k8LRzOz5lIT9Ze87gV_lgXbpkzQzKFNhxOmV_BhEu1PCLcOTHhic93WQk_E97nYCOwOifmkEFOCBzHEuTG1XHJ1nGEfBCAsdUXrMg_lU3w86TfVDYS6xLVtfVAq4ihDjBsmtPthrdMG4H5Qls8EM-_cbIRe7UEAQK9MgXDLHaQZbx_lQ46_P852SpCprbvqWaoM8zKyEiDf1q6O89D6YIaDw"
}
Run Code Online (Sandbox Code Playgroud)
然后在 C# 中,我有一个包含这些字段的模型,并创建了一个函数来测试我是否可以验证数据:
public class RSAKeyPair
{
public string kty { get; set; }
public string e { get; set; }
public string use { get; set; }
public string alg { get; set; }
public string n { get; set; }
public string d { get; set; } …Run Code Online (Sandbox Code Playgroud) 我有一个用 GADT 创建的数据结构,我想使用aeson. 但是类型检查器抱怨在所有情况下只能创建 GADT 的构造函数之一。看这个例子:
data Foo = Hello | World
data SFoo :: Foo -> Type where
SHello :: SFoo 'Hello
SWorld :: SFoo 'World
instance FromJSON (SFoo a) where
parseJSON = withText "Foo" \case
"hello" -> pure SHello
"world" -> pure SWorld
Run Code Online (Sandbox Code Playgroud)
所以我希望能够将“hello”字符串解析为SHello,将“world”字符串解析为SWorld. 类型检查器抱怨以下错误:
data Foo = Hello | World
data SFoo :: Foo -> Type where
SHello :: SFoo 'Hello
SWorld :: SFoo 'World
instance FromJSON (SFoo a) where
parseJSON …Run Code Online (Sandbox Code Playgroud) haskell ×2
.net ×1
aeson ×1
c# ×1
cryptography ×1
expression ×1
gadt ×1
recursion ×1
rsa ×1
text-parsing ×1