我想发送一些JSON,它将包含从(Database.Persist.Sql)键到值的映射.显而易见的解决方案是使用a Map (Key x) v,但这不是一个实例ToJSON.
一些替代方案是:
Map k v,返回a Map Text v(但在这里我会丢失一些类型信息)type JsonKey = Text,而且Map JsonKey v,这不是更好ToJSON实例.后者似乎是需要较少变化的那个,而更清洁的变化.
另外,请注意我只需要ToJSON实例,而不是FromJSON,所以我不需要整个往返.
所以,这就是我想写的:
import Database.Persist.Sql (Key)
instance ToJSON (ToJSON v => (Map (Key a) v))
Run Code Online (Sandbox Code Playgroud)
假设Key有一个友好的Show实例(它没有,但这只是一个细节)......我正要写:
instance ToJSON (ToJSON v => (Map (Key a) v)) where
toJSON m = toJSON $ mapKeysMonotonic show m
Run Code Online (Sandbox Code Playgroud)
但我立刻意识到这很糟糕(键就像整数一样):
> 9 < 10 …Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,几天前开始学习,我对要创建的函数有疑问。
我想制作一个函数来验证x是否为n的因数(例如:375具有以下因数:1、3、5、15、25、75、125和375),然后移除1,然后移除数字本身,并最终验证该列表中的奇数个数是否等于偶数个数!
我想到了制作这样的函数来计算第一部分:
factor n = [x | x <- [1..n], n `mod`x == 0]
Run Code Online (Sandbox Code Playgroud)
但是如果我在提示上提示的话Not in scope 'n'。想法是输入375这样的数字,以便计算列表。我做错了什么?我已经看到在书本中这样输入提示的功能。
然后,考虑到我所说的元素,我想到的是做尾巴,然后初始化列表。您认为这是个好主意吗?
最后,我想到了一个if语句来验证最后一部分。例如,在Java中,我们将执行以下操作:
(x % 2 == 0)? even++ : odd++; // (I'm a beginner to Java as well)
Run Code Online (Sandbox Code Playgroud)
然后,如果偶数=奇数,则表示所有条件均已验证(我们的偶数数量等于奇数)
但是在Haskell中,由于变量是不可变的,我该怎么做something ++的事情?
谢谢你提供的所有帮助 :)
我试图在挑选中readIO进行权衡read,然后我写了这2个片段
> map read . words <$> getLine :: IO [Int]
1 2 a
[1,2,*** Exception: Prelude.read: no parse
> mapM readIO . words =<< getLine :: IO [Int]
1 2 a
*** Exception: user error (Prelude.readIO: no parse)
Run Code Online (Sandbox Code Playgroud)
我知道在纯代码中抛出异常(就像read那样)通常很糟糕,但通常我总是在IO monad中使用read,因此我应该能够几乎总是捕获异常.
readIO是不是在为许多片断/例子/教程使用从我所看到的,但OTOH在携带型的可能性的错误似乎是一件好事,并收集所有Read a在一个单一的IO mapM产量更早的误差比第一简单的例子map.快速失败通常是令人垂涎的财产.
我应该四处走动并read用readIOs 代替所有s吗?