我有一个关于GHCi如何假设整数的类型的问题.
我正在阅读是 - 没有类型的类学习你哈斯克尔.
如果你想阅读整个内容,这里有一个链接. http://learnyouahaskell.com/making-our-own-types-and-typeclasses#a-yes-no-typeclass
简而言之,本章说明通过定义我自己的类,我可以创建一个适用于很多类型的函数.
本书定义了具有函数的YesNo类
yesno :: a -> Bool
Run Code Online (Sandbox Code Playgroud)
并Int作为YesNo类的实例
instance YesNo Int where
yesno 0 = False
yesno _ = True
Run Code Online (Sandbox Code Playgroud)
当我把它加载到我的GHCi上并输入时
yesno 0
Run Code Online (Sandbox Code Playgroud)
它返回错误.我认为这可能是因为GHCI不能告诉0是否意味着是Int或Integer或Double或其他类型的Num类.实际上,当我键入yesno(0 :: Int)时,它起作用了.
所以只是为了我Integer作为YesNo课堂实例而写的乐趣
instance YesNo Integer where
yesno 0 = True
yesno _ = False
Run Code Online (Sandbox Code Playgroud)
(注意我翻转了True和False)并再次输入
yesno 0
Run Code Online (Sandbox Code Playgroud)
(没有任何类型声明)然后GHCi显示True.
而且,当我输入
yesno $ fromIntegral 0
Run Code Online (Sandbox Code Playgroud)
它返回了True,这意味着GHCi认为的类型fromIntegral 0是Integer.
那么,这是否意味着当我在GHCi上输入一个整数时,它通常假定它的值Integer …
我刚刚学习了random功能.
据我所知,random函数接受一个类型的值,它是一个实例,RandomGen并返回一个我们可以指定其值的随机值.另一方面,mksdGen取一个Int并生成一个random功能需要的随机发生器.
我试图生成随机Bool值.为了做到这一点,我做了一个功能randomBool.
randomBool :: Int -> Bool
randomBool = fst . random . mkStdGen
Run Code Online (Sandbox Code Playgroud)
然后我找到了True比Falses少的数字更多的s.我很好奇,并检查如下
> length $ takeWhile randomBool [1..]
53667
Run Code Online (Sandbox Code Playgroud)
我认为这意味着对于第一个53667正整数,random . mkStdGen回报True,这对我来说似乎不是很随机.这很正常吗?或者我做错了什么让True事情更容易发生?
真实世界Haskell说:"如果我们在模式中引入变量名称,Haskell编译器可以警告我们,但不要在函数体中使用它".
我经常忘记使用我绑定的变量,所以我想使用这个功能.但是我的ghci和ghc似乎没有使用未使用的变量,而且自从几个月前我开始学习Haskell以来,我实际上从未见过这个.
我该如何使用此功能?或者Haskell编译器不再具有此功能了?
我last用foldl1和编写函数foldr1.
lastr :: [a] -> a
lastr = foldr1 (flip const)
lastl :: [a] -> a
lastl = foldl1 (flip const)
Run Code Online (Sandbox Code Playgroud)
它们只适用于短名单.但是当我尝试使用很长的列表[1..10 ^ 8]时,lastr在6.94秒内返回解决方案但是lastl内存不足.
foldr1和foldl1的定义是(根据我的理解)
foldr1 f [x] = x
foldr1 f (x:xs) = f x $ foldr1 f xs
Run Code Online (Sandbox Code Playgroud)
和
foldl1 f [x] = x
foldl1 f (x:y:ys)=foldl1 f $ f x y : ys
Run Code Online (Sandbox Code Playgroud)
从这些看来,foldl1似乎比foldr1使用更少的内存,因为foldr1需要保持一个表达式f x1 $ f x2 $ f x3 $ f x4 $...,因为foldl1可以只计算f x y每次并将其存储为列表的头元素而不是保持它直到它达到10 …
作为我的第一个模块体验,我将Data.List导入了GHCi.(更准确地说,我输入import Data.List了我的GHCi)它似乎工作正常,因为我可以使用一些我以前没有的功能,比如foldl'我的GHCi.
我写haha = foldl' (+) 0 [1..10]了我的记事本++,并保存并加载然后GHCi说,Not in scope: foldl'即使它foldl' (+) 0 [1..10]直接键入我的GHCi 它工作得很好.
为什么这样,我如何foldl'在记事本上定义功能?
了解一下Haskell有一个代码示例如下:
ghci> B.pack [99,97,110]
Chunk "can" Empty
Run Code Online (Sandbox Code Playgroud)
(B代表Data.ByteString.Lazy)
但我ghci没有展示Chunk和Empty数据构造函数.
> B.pack [99,97,110]
"can"
Run Code Online (Sandbox Code Playgroud)
Haskell开发人员是否改变了ByteString打印值的方式?
我正在为合并排序(Haskell)编写代码.
我有一个关于根据顺序将两个列表放在一起的函数的问题.
(即[1,4,7] [2,5,6] - > [1,2,4,5,6,7])
这是我的原始代码.(xs,ys是参数,zs是累加器.)
msort4 [] ys zs = zs ++ ys
msort4 xs [] zs = zs ++ xs
msort4 allx@(x:xs) ally@(y:ys) zs
| x <= y = msort4 xs ally (zs ++ [x])
| otherwise = msort4 allx ys (zs ++ [y])
Run Code Online (Sandbox Code Playgroud)
这是我在引用我在网上找到的代码后写的第二个代码.
msort4 [] ys = ys
msort4 xs [] = xs
msort4 allx@(x:xs) ally@(y:ys)
| x <= y = x :msort4 xs ally
| otherwise = y : msort4 allx ys
Run Code Online (Sandbox Code Playgroud)
只是这个小差异,我的代码改进了很多. …
我一直在教自己Haskell一个月左右,今天我正在阅读第16个问题的解决方案并想出了一个问题.
这是一个链接:http://www.haskell.org/haskellwiki/99_questions/Solutions/16
基本上,这个问题要求创建一个从列表中删除每个第N个元素的函数.例如,
*Main> dropEvery "abcdefghik" 3
"abdeghk"
链接中的第一个解决方案是
dropEvery :: [a] -> Int -> [a]
dropEvery [] _ = []
dropEvery (x:xs) n = dropEvery' (x:xs) n 1
where
dropEvery' (x:xs) n i = (if (n `divides` i) then [] else [x])++ (dropEvery' xs n (i+1))
dropEvery' [] _ _ = []
divides x y = y `mod` x == 0
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么dropEvery定义了空列表的情况,而dropEvery'可以处理空列表?我认为dropEvery [] _ = []可以简单地删除并修改一些其他句子,因为下面应该与上面完全相同并且看起来更短.
dropEvery :: [a] -> Int -> [a]
dropEvery …Run Code Online (Sandbox Code Playgroud) 我正在这个页面上工作
http://www.haskell.org/haskellwiki/99_questions/Solutions/4
我理解每个函数的含义,看到函数可以通过多种方式定义,这很有趣.但是,我刚开始想知道哪一个更快.而且我认为这将是它说的是一个length在Prelude.
length [] = 0
length (x:xs) = 1 + length xs
Run Code Online (Sandbox Code Playgroud)
然而,这比length在慢得多Prelude.
在我的计算机length上Prelude返回的长度为[1..10^7]0.37秒.但是,如上定义的功能花费了15.26秒.
我定义了自己的长度函数,它使用了累加器.仅花了8.99秒.
我想知道为什么会出现这些巨大的差异?
我刚刚了解了Karatsuba算法,并尝试在Haskell中实现它.
这是我的代码:
(***) :: Integer -> Integer -> Integer
x *** y
| max x y < ub = x*y
| otherwise =z2*base*base + ((x1+x0)***(y1+y0)-z2-z0)*base + z0
where
base =10^((length . show $ max x y) `div` 2)
z2 =x1***y1
z0 = x0***y0
(x1, x0) = helper x
(y1, y0) = helper y
helper n = (n `div` base, n `mod` base)
ub = 10000
Run Code Online (Sandbox Code Playgroud)
只要我检查了大数字,如20 -30位数,速度足够10-20位,这就可以正常工作.但是,*当100位数甚至更大的数字时,这比平常慢很多.我怎么能改进这个算法?