小编ber*_*rio的帖子

违反mapKeysMonotonic前提条件

我想发送一些JSON,它将包含从(Database.Persist.Sql)键到值的映射.显而易见的解决方案是使用a Map (Key x) v,但这不是一个实例ToJSON.

一些替代方案是:

  • 不要使用JSON,使用更好的东西(比如edn)
  • 不返回a 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)

json dictionary haskell

5
推荐指数
1
解决办法
80
查看次数

Haskell函数关于偶数和奇数

我是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 ++的事情?

谢谢你提供的所有帮助 :)

haskell numbers function

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

什么时候我更喜欢读取读取?(或相反亦然)

我试图在挑选中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.快速失败通常是令人垂涎的财产.

我应该四处走动并readreadIOs 代替所有s吗?

haskell

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

标签 统计

haskell ×3

dictionary ×1

function ×1

json ×1

numbers ×1