我正在 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) 我有以下带有半组元素的 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 代码对我来说仍然很新鲜。
有人可以向我解释,为什么这行不通?
builder.Setup(b => b.BuildCommand(query ?? It.IsAny<string>())).Returns(command);
Run Code Online (Sandbox Code Playgroud)
如果query是null,BuildCommand将通过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)
取决于我是否关心该参数。