小编L01*_*man的帖子

为什么Haskell中的Eq不是每个类型的一部分?

或者更确切地说,为什么不能(==)在每种数据类型上使用?为什么我们必须得到Eqourseleves?在其他语言中,例如Python,C++,当然还有其他语言,它有一个默认的实现!我想不出无法比较的类型.

haskell typeclass

16
推荐指数
5
解决办法
2372
查看次数

Haskell中的参数数量和无点数

使用多个模式匹配,即使没有点,也不可能有不同数量的参数!

foo True b = b + 2
foo _ = id
Run Code Online (Sandbox Code Playgroud)

不起作用的例子.但

foo True = (+2)
foo _ = id
Run Code Online (Sandbox Code Playgroud)

确实.有时我们只能在函数的一个部分使用无点,所以......

为什么?GHC太难了吗?:'(

haskell arguments currying pointfree

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

Haskell中的游戏服务器

我使用Network,并Gloss在哈斯克尔游戏服务器.它工作正常,除了客户端必须关闭服务器以接收它发送的数据.我打赌这是一个懒惰的案例......

极简主义服务器:

import Network
import System.IO

main = do
    sock <- listenOn (PortNumber (fromIntegral 12345))
    loop sock

loop sock = do
    (hIn, _, _) <- accept sock
    str <- hGetContents hIn
    print str
    loop sock
Run Code Online (Sandbox Code Playgroud)

极简主义客户:

import Network
import System.IO
import Graphics.Gloss.Interface.IO.Game

main = playIO
    (InWindow "Test Multi" (500, 500) (500, 500))
    white
    60
    Nothing
    draw
    (\_ x -> return x)
    advance

draw Nothing = return blank
draw (Just x) = return (Text (show x))

advance …
Run Code Online (Sandbox Code Playgroud)

haskell network-programming lazy-evaluation

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

Haskell:重复的函数(+)和(++),mappend

(+)而且(++)只是专业化mappend; 我对吗?他们为什么需要?这是无用的重复,因为Haskell具有这些强大的类型类和推断.比方说,我们删除(+)(++)重命名mappend (+)为直观方便并输入增益.对于初学者来说,编码会更直观,更短,更容易理解:

--old and new
1 + 2
--result
3

--old
"Hello" ++ " " ++ "World"
--new
"Hello" + " " + "World"
--result
"Hello World"

--old
Just [1, 2, 3] `mappend` Just [4..6]
--new
Just [1, 2, 3] + Just [4..6]
--result
Just [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

(这让我梦想.)对于一个坚持抽象的美丽语言和Haskell之类的东西来说,同一个函数中的三个,甚至更多函数并不是一件好事.我也看到了相同的一种单子重复:fmap是相同的,或近,如map,(.),liftM,mapM,forM,...我知道有对史传的原因fmap,但什么幺?Haskell委员会是否正在计划这方面的事情?它会破坏一些代码,但我听说,虽然我不确定,但是有一个传入的版本会有很大的变化,这是一个很好的场合.太可惜了......至少,叉子价格合理吗?

编辑 在回答我看了,有一个数字,无论是事实 …

monads haskell operator-overloading typeclass monoids

11
推荐指数
2
解决办法
1348
查看次数

Haskell:函数应该接收"多少"类型?并避免完全"重建"

我有这些数据类型:

data PointPlus = PointPlus
    { coords :: Point
    , velocity :: Vector
    } deriving (Eq)

data BodyGeo = BodyGeo
    { pointPlus :: PointPlus
    , size :: Point
    } deriving (Eq)

data Body = Body
    { geo :: BodyGeo
    , pict :: Color
    } deriving (Eq)
Run Code Online (Sandbox Code Playgroud)

它是我游戏中角色,敌人,物体等的基本数据类型(好吧,我现在只有两个矩形作为玩家和地面:p).

当一个键,字符通过改变它来向右,向左或跳跃velocity.移动是通过添加velocitycoords.目前,它的编写如下:

move (PointPlus (x, y) (xi, yi)) = PointPlus (x + xi, y + yi) (xi, yi)
Run Code Online (Sandbox Code Playgroud)

我只是接受了PointPlus我的一部分,Body而不是全部Body,否则它将是:

move (Body (BodyGeo …
Run Code Online (Sandbox Code Playgroud)

haskell types function

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

如何在Haskell中处理表达式?

比方说我有:

f :: Double -> Double
f x = 3*x^2 + 5*x + 9
Run Code Online (Sandbox Code Playgroud)

我想计算这个函数的衍生物并写

derivate f
Run Code Online (Sandbox Code Playgroud)

以便

derivate f == \x -> 6*x + 5
Run Code Online (Sandbox Code Playgroud)

但如何定义derivate

derivate :: (a -> a) -> (a -> a)
derivate f = f' -- how to compute f'?
Run Code Online (Sandbox Code Playgroud)

我知道没有本地方法可以做到这一点,但是有一个库可以吗?

我们是否必须依靠"meta"-datatypes来实现这一目标?

data Computation = Add Exp Expr | Mult Expr Expr | Power Expr Expr -- etc
Run Code Online (Sandbox Code Playgroud)

那么,为每个函数创建一个相应的构造函数是不是很痛苦?但是,数据类型不应表示函数(解析器除外).

纯粹的,因为它的长期重写功能的一个很好的选择?它有它的缺点吗?

列表价格合理吗?

f :: [Double]
f = [3, 5, 9]

derivate :: …
Run Code Online (Sandbox Code Playgroud)

haskell expression

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

球拍:在帧%窗口中使用事件

我正在学习Racket(以前的PLT Scheme,一种LISP方言)并试图发现如何处理不同的事件paint-callback(也许它甚至不是一个).

我希望有很多来自商务部的这一部分,但on-charon-event似乎什么都不做,可以让我感兴趣(或者什么都没有).

另外,我不了解事件空间,队列回调及其用途.一个例子是一件很酷的事情!我会感谢能给我写一个的好男人:).

这是我的代码:

(define game (new frame%))

(define gameLay (class canvas% (super-new)))

(new gameLay
     [parent game]
     [paint-callback (? (canvas dc) #|draw things|#)])
Run Code Online (Sandbox Code Playgroud)

我想使用"on-mouse-click-left"(不存在)之类的东西,我使用"paint-callback",但我想我需要添加步骤(我已经读过有关事件空间等).我知道它不起作用,但这是我正在寻找的假设代码:

(new gameLay
     [parent game]
     [paint-callback (? (canvas dc) #|draw things|#)]
     [on-mouse-click-left (? (canvas dc) #|do other things|#)])
Run Code Online (Sandbox Code Playgroud)

events scheme racket

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

Ord和Enum有时在Haskell中不兼容吗?

莫非OrdEnum是一个类型类的?为什么Enum不需要Eq

haskell typeclass

8
推荐指数
2
解决办法
1189
查看次数

列表在Haskell中定义为Maybe?为什么不?

Maybe List除了错误处理之外,你不会看到它,因为列表Maybe本身有点:它们有自己的" Nothing":[]和它们自己的" Just": (:). 我使用Maybe和函数编写了一个列表类型,将标准转换为"实验"列表.toStd . toExp == id.

data List a = List a (Maybe (List a))
    deriving (Eq, Show, Read)

toExp [] = Nothing
toExp (x:xs) = Just (List x (toExp xs))

toStd Nothing = []
toStd (Just (List x xs)) = x : (toStd xs)
Run Code Online (Sandbox Code Playgroud)

您如何看待它,作为减少重复的尝试,概括一下?

树也可以使用这些列表定义:

type Tree a = List (Tree a, Tree a)
Run Code Online (Sandbox Code Playgroud)

不过,我还没有测试过最后一段代码.

haskell list maybe

5
推荐指数
3
解决办法
1609
查看次数

Haskell中的数字域

Haskell是不是因为拉姆达演算的许多语言的详细数学,但我认为,域名是不完整的数字:我们有IntegerFloat,例如,而不是PositiveNegative,或[1..5]作为域.这有时会使函数不安全,而编译器可能会捕获类型错误.例如:5mod 仅在运行时0输出*** Exception: divide by zero. mod :: Integral a => a -> a -> a但我们可以有类似的东西mod :: Integral a, a != 0 => a -> a -> a; 像守卫或间隔或其他数据类型的东西......在游戏中,我希望我的角色有一个正数的生命.或者从0到100,不在下,不是上.当他被击中时,我需要称之为丑陋positive x = if x > 0 then x else 0.连C都signedunsigned.

这是一个弱点还是他们为什么没有"间隔"域名的原因?有没有一个包修复这个?

math haskell

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