小编Chr*_*ert的帖子

Haskell,创建 Html 表单的通用方法

我正在 Servant 中构建一个站点,并且想知道是否无法创建用于生成输入字段的 Generic 实例。

我想要的是有一个

class ToInputField a where
    toInputField :: a -> InputField
Run Code Online (Sandbox Code Playgroud)

这样,一个示例实现可以是

instance ToInputField Text where
    toInputField t = InputField { type = InputText, value = t, name = "some name which I would like to be derived" }
Run Code Online (Sandbox Code Playgroud)

现在,如果一个类型的每个访问器函数都实现了这个类,我想做一些类似 ToJSON 的事情。

instance ToJSON Person
Run Code Online (Sandbox Code Playgroud)

而是做

class ToForm a where
    toForm :: a -> [InputField]

instance ToForm Person
Run Code Online (Sandbox Code Playgroud)

但是有类似的东西toInputField :: Text -> a -> InputField,其中 Text 是访问器字段的名称。所以toInputField可以这样实现

instance ToInputField Text where
    toInputField …
Run Code Online (Sandbox Code Playgroud)

generics haskell servant

5
推荐指数
0
解决办法
85
查看次数

是否有一个 Monad 收集结果并“mappend”它们?

我有以下带有半组元素的 Reader 模式:

runFunction :: Reader Env Element
runFunction = do
  a <- getA
  b <- getB
  c <- getC
  return $ a <> b <> c
Run Code Online (Sandbox Code Playgroud)

哪里getA :: Reader Env Element

有没有办法:

runFunction = do
  getA
  getB
  getC
Run Code Online (Sandbox Code Playgroud)

我觉得我经常看到这种模式,我命令式地链接 monadic 调用,最后它们变成了单个元素。

注意:我不想做,getA >>= getB >>= getC因为getB不是:: Element -> Reader Env Element

感觉就像一个 State Monad,它会用 自动修改状态<>,但我不知道。

使用 monadic 代码对我来说仍然很新鲜。

monads haskell functional-programming state-monad monoids

3
推荐指数
1
解决办法
122
查看次数

为什么是?? 操作员无法使用Moq设置方法

有人可以向我解释,为什么这行不通?


builder.Setup(b => b.BuildCommand(query ?? It.IsAny<string>())).Returns(command);
Run Code Online (Sandbox Code Playgroud)

如果querynullBuildCommand将通过null,而不是It.IsAny<string>()

相反,我必须这样做:

if(query == null)
    builder.Setup(b => b.BuildCommand(It.IsAny<string>())).Returns(command);
else
    builder.Setup(b => b.BuildCommand(query)).Returns(command);
Run Code Online (Sandbox Code Playgroud)

与代表有关吗?


编辑-完整示例

public static void ReturnFromBuildCommand(this Mock<IQueryCommandBuilder> builder, IQueryCommand command, string query = null)
{
    if(query == null)
        builder.Setup(b => b.BuildCommand(It.IsAny<string>())).Returns(command);
    else
        builder.Setup(b => b.BuildCommand(query)).Returns(command);
}
Run Code Online (Sandbox Code Playgroud)

然后我可以这样称呼它

var command = new Mock<IQueryCommand>();
var builder = new Mock<IQueryCommandBuilder>();
builder.ReturnFromBuildCommand(command.Object);
Run Code Online (Sandbox Code Playgroud)

要么

string query = "SELECT Name FROM Persons;";
builder.ReturnFromBuildCommand(command.Object, query);
Run Code Online (Sandbox Code Playgroud)

取决于我是否关心该参数。

c# null moq

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