或者更确切地说,为什么不能(==)
在每种数据类型上使用?为什么我们必须得到Eq
ourseleves?在其他语言中,例如Python,C++,当然还有其他语言,它有一个默认的实现!我想不出无法比较的类型.
使用多个模式匹配,即使没有点,也不可能有不同数量的参数!
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太难了吗?:'(
我使用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) (+)
而且(++)
只是专业化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委员会是否正在计划这方面的事情?它会破坏一些代码,但我听说,虽然我不确定,但是有一个传入的版本会有很大的变化,这是一个很好的场合.太可惜了......至少,叉子价格合理吗?
编辑 在回答我看了,有一个数字,无论是事实 …
我有这些数据类型:
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
.移动是通过添加velocity
到coords
.目前,它的编写如下:
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) 比方说我有:
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) 我正在学习Racket(以前的PLT Scheme,一种LISP方言)并试图发现如何处理不同的事件paint-callback
(也许它甚至不是一个).
我希望有很多来自商务部的这一部分,但on-char
并on-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) 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是不是因为拉姆达演算的许多语言的详细数学,但我认为,域名是不完整的数字:我们有Integer
和Float
,例如,而不是Positive
或Negative
,或[1..5]
作为域.这有时会使函数不安全,而编译器可能会捕获类型错误.例如:5
mod 仅在运行时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都signed
和unsigned
.
这是一个弱点还是他们为什么没有"间隔"域名的原因?有没有一个包修复这个?