小编jpm*_*ier的帖子

如果不在 Eq 类中,Haskell 整数文字如何进行比较?

在 Haskell 中(至少在 GHC v8.8.4 中),在Num课堂上并不意味着在Eq课堂上:

$ ghci
 GHCi, version 8.8.4: https://www.haskell.org/ghc/  :? for help
 ?> 
 ?> let { myEqualP :: Num a => a -> a -> Bool ; myEqualP x y = x==y ; }

<interactive>:6:60: error:
    • Could not deduce (Eq a) arising from a use of ‘==’
      from the context: Num a
        bound by the type signature for:
                   myEqualP :: forall a. Num a => a -> a -> Bool …
Run Code Online (Sandbox Code Playgroud)

haskell

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

如何在Haskell中替换字符串中的多个字符?

我正在制作一个程序,使用世界语X-System替换世界语,所以我需要它来将“ cx”转换为“?”,“ sx”转换为“?”,“ gx”转换为“ g”,“ jx”到“?”,“ ux”到“?”,大写字母相同。

当前,它将“ a”转换为“ b”,将“ c”转换为“ d”。我当前使用的方法仅适用于替换单个字符,而不是多个字符。那么,如何替换多个字符(例如“ cx”)而不是单个字符(例如“ a”)?

replaceChar :: Char -> Char
replaceChar char = case char of
                     'a' -> 'b'
                     'c' -> 'd'
                     _   -> char

xSistemo :: String -> String
xSistemo = map replaceChar
Run Code Online (Sandbox Code Playgroud)

因此,当前“猫”将转换为“ dbts”。

string haskell replace

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

为什么可以将无效的列表表达式(例如 2:1)分配给变量,但不打印?

在 ghci 终端中,允许进行以下变量赋值:

a = [2:x | x <- [1, 1, 1]]
Run Code Online (Sandbox Code Playgroud)

但是a打印的时候出现如下错误:

- No instance for (Num [Integer]) arising from a use of 'it'
- In the first argument of 'print', namely 'it'
- In a stmt of an interactive GHCi command: print it
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

haskell

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

缺少 Haskell 原语以将函数连续应用于列表的每个元素?

在 Haskell 中,众所周知,map原语可用于将给定函数应用于列表的所有元素:

 ?> map toUpper "abcd"
"ABCD"
 ?> 
Run Code Online (Sandbox Code Playgroud)

在尝试生成有限集(列表)的所有分区时,以下类似的原语会很方便:

 ?> sap toUpper "abcd"
["Abcd","aBcd","abCd","abcD"]
 ?> 
Run Code Online (Sandbox Code Playgroud)

sap站立连续应用。类型签名将是:

sap :: (a -> a) -> [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)

例如,集合“abcd”的部分分区可以从“bcd”的分区中通过用('a':)sap'来获得。

 ?> pbcd = [["b","c","d"],["b","cd"],["bc","d"],["c","bd"],["bcd"]]
 ?> 
 ?> concatMap (sap ('a':)) pbcd
[["ab","c","d"],["b","ac","d"],["b","c","ad"],["ab","cd"],["b","acd"],["abc","d"],["bc","ad"],["ac","bd"],["c","abd"],["abcd"]]
 ?> 
Run Code Online (Sandbox Code Playgroud)

然后可以通过添加 'a' 作为它自己单独的单例来获得 5 个丢失的分区。

我的问题是,我一直无法在语言库中找到这样的原语,而且给定类型签名的Hoogle没有返回任何感兴趣的内容。

sapHaskell 语言库中是否存在这样的原语???或者有没有一种方法可以写得如此简短和简单,以至于它甚至不值得成为一个单独的函数,将其置于所谓的费尔贝恩阈值以下

脚注:可以这样写sap

sap :: (a -> a) -> [a] -> [[a]]
sap fn ls = fst  $  foldr …
Run Code Online (Sandbox Code Playgroud)

haskell combinatorics

5
推荐指数
2
解决办法
183
查看次数

如何将 do 表示法与 System.Random.Stateful 一起使用

我想使用 do 表示法来组合伪随机值:

g :: StdGen
g = mkStdGen 100

example1 :: Bool
example1
  = fst
  $ runState
    (do x <- state (uniformR (False,True))
        y <- state (uniformR (False,True))
        return $ x == y
    )
    g
Run Code Online (Sandbox Code Playgroud)

函数uniformR是根据 System.Random.Stateful 模块定义的:

uniformR :: (RandomGen g, UniformRange a) => (a, a) -> g -> (a, g)
uniformR r g = runStateGen g (uniformRM r)
Run Code Online (Sandbox Code Playgroud)

因此,在我的示例中,创建并运行状态似乎很愚蠢uniformR,只有我的示例再次创建并运行状态。

有没有办法使用 System.Random.Stateful 和 do 表示法重写示例 1?

这是我唯一可以开始工作的事情(这很荒谬):

example3 :: Bool
example3
  = fst
  $ …
Run Code Online (Sandbox Code Playgroud)

random haskell

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

RandomGen 的拆分函数的确切语义应该是什么?

似乎在 Haskell 中, 的行为split可能强烈依赖于选择的(伪)随机数生成器(PRNG)。我被splitAPI 中的各种生成随机数的方法所吸引。

假设我们采用相对较新的Threefish生成器。

我们会需要:

 ?> import System.Random
 ?> import System.Random.TF
 ?> import Control.Monad.Random
Run Code Online (Sandbox Code Playgroud)

接下来,我们以 3 种不同的方式生成 20 个两位数的序列:

 ?> tg0 = mkTFGen 42
 ?> 
 ?> evalRand  (sequence (replicate 20 $ getRandomR (10,99)))  tg0
[62,99,78,18,38,21,54,25,54,94,62,57,55,69,98,78,99,73,59,24]
 ?> 
 ?> take 20 $ evalRand  (sequence (repeat $ getRandomR (10,99)))  tg0
[62,99,78,18,38,21,54,25,54,94,62,57,55,69,98,78,99,73,59,24]
 ?> 
 ?> take 20 $  evalRand  (getRandomRs (10,99))  tg0
[62,99,78,18,38,21,54,25,54,94,62,57,55,69,98,78,99,73,59,24]
 ?> 
Run Code Online (Sandbox Code Playgroud)

无论我们是否采用无限序列的前缀,我们都会得到 3 次相同的序列。

但对于“标准”StdGen 生成器而言,情况并非如此。这里:

 ?> 
 ?> sg0 = mkStdGen 42 …
Run Code Online (Sandbox Code Playgroud)

random haskell

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

为什么需要`fmap` 在`Maybe Integer` 上调用`succ`?

我是 Haskell 的新手,正在研究 Collat​​z 猜想问题。所需的输出是从给定整数变为 1 所需的步数。这是我第一次不得不使用该Maybe类型,这可能会导致我的困惑。

我有这个工作解决方案基于另一个我发现的相同问题的解决方案:

collatz :: Integer -> Maybe Integer
collatz n
    | n <= 0 = Nothing
    | n == 1 = Just 0
    | even n = fmap succ . collatz $ n `div` 2
    | otherwise = fmap succ . collatz $ 3 * n + 1
Run Code Online (Sandbox Code Playgroud)

我不清楚的是为什么有必要fmap succ在这种情况下使用。根据我目前的理解,我希望能够调用succ递归调用的输出collatz以增加它;但是,这会引发错误:

> No instance for (Enum (Maybe Integer))
        arising from a use of `succ'
Run Code Online (Sandbox Code Playgroud)

它看起来像错误有事情做与调用succ一个 …

haskell types functor collatz map-function

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

Haskell 作业中类型构造函数的问题

我创建了一个数据类型,需要使用 instance 使其成为相等类型类的实例。我的数据类型由值 R a b 组成。我想使R x y等于R c dif xis equal tocyis equal to d

这是我到目前为止编写的代码。它不编译。

 data Row a b = R a b deriving (Show)
 instance Eq (Row a b)  where
     (R x y) == (R c d) = (x == c) && (y == d)
     _ == _ = False
Run Code Online (Sandbox Code Playgroud)

我认为这可能是错误的,因为类型 a 和 b 不一定必须在 Equality 类型类中。我不知道如何解决这个问题。

haskell typeclass

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

用于在Haskell中生成列表的唯一组合的函数

是否有一个Haskell函数可以从列表中生成给定长度的所有唯一组合?

Source = [1,2,3]

uniqueCombos 2 Source = [[1,2],[1,3],[2,3]]
Run Code Online (Sandbox Code Playgroud)

我试过寻找Hoogle,但找不到具体做到这一点的功能.排列不会产生预期的结果.

以前有人用过类似的功能吗?

combinations haskell combinatorics

0
推荐指数
2
解决办法
808
查看次数