Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 绑定链中更平滑的类型注释_Haskell - Fatal编程技术网

Haskell 绑定链中更平滑的类型注释

Haskell 绑定链中更平滑的类型注释,haskell,Haskell,因此,我有一个工作示例(Snap+Postgres): 还有其他更“流畅”的方式吗?(最好不指定包装单子类型)您可以将其稍微缩短为 query_ "select * from books" >>= writeJSON . (\x -> x :: [Book]) 除此之外,目前还没有,尽管有计划为快捷语法实现GHC扩展 (:: [Book]) = (\x -> x :: [Book]) 看着 它的代码似乎是3天前开始编写的,因此应该在下一个GHC版本中。如果启用Part

因此,我有一个工作示例(Snap+Postgres):


还有其他更“流畅”的方式吗?(最好不指定包装单子类型)

您可以将其稍微缩短为

query_ "select * from books" >>= writeJSON . (\x -> x :: [Book])
除此之外,目前还没有,尽管有计划为快捷语法实现GHC扩展

(:: [Book]) = (\x -> x :: [Book])
看着
它的代码似乎是3天前开始编写的,因此应该在下一个GHC版本中。

如果启用
PartialTypeSignatures
,您可以编写:

query_ "select * from books" >>= (writeJSON :: [Book] -> _)
也可以将其拼写为对
查询的约束;e、 g.在您的
do
版本中,它将是:

listBooks :: AppHandler ()
listBooks = do
  results <- query_ "select * from books" :: _ [Book]
  writeJSON results
最后,如果您不喜欢类型注释,但喜欢术语注释,那么您可以编写

query_ "select * from books" >>= asAppliedTo [Book{}] writeJSON
其中,
Book
Book
类型的假设构造函数(要点是
[Book{}]
虽然是无意义值,但具有单态类型)。我似乎记得,应用于
是一件标准的事情,但快速的胡闹并不能揭示这一点;在任何情况下,其实现方式与此类似:

asAppliedTo :: arg -> (arg -> result) -> (arg -> result)
asAppliedTo _ = id

您确实需要使用内联注释或单独定义中的签名来指定类型。顺便说一下,有一个可以为您的第二个代码段提供语法糖的。
query_ @[Book] "select * from books" >>= writeJSON
query_ "select * from books" >>= writeJSON @[Book]
query_ "select * from books" >>= asAppliedTo [Book{}] writeJSON
asAppliedTo :: arg -> (arg -> result) -> (arg -> result)
asAppliedTo _ = id