在 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) 我正在制作一个程序,使用世界语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”。
在 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 中,众所周知,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) 我想使用 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) 似乎在 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) 我是 Haskell 的新手,正在研究 Collatz 猜想问题。所需的输出是从给定整数变为 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一个 …
我创建了一个数据类型,需要使用 instance 使其成为相等类型类的实例。我的数据类型由值 R a b 组成。我想使R x y等于R c dif xis equal toc和yis 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函数可以从列表中生成给定长度的所有唯一组合?
Source = [1,2,3]
uniqueCombos 2 Source = [[1,2],[1,3],[2,3]]
Run Code Online (Sandbox Code Playgroud)
我试过寻找Hoogle,但找不到具体做到这一点的功能.排列不会产生预期的结果.
以前有人用过类似的功能吗?
haskell ×9
random ×2
collatz ×1
combinations ×1
functor ×1
map-function ×1
replace ×1
string ×1
typeclass ×1
types ×1