小编sda*_*das的帖子

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

如何在Swing中组织我的动作?

我目前正在替换我的匿名ActionListeners

new ActionListener() {
    @Override
    public void actionPerformed(final ActionEvent event) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

使用表示操作的类文件:

public class xxxxxxxAction extends AbstractAction {
}
Run Code Online (Sandbox Code Playgroud)

但是,我的GUI能够执行很多操作(例如CreatePersonAction,RenamePersonAction,DeletePersonAction,SwapPeopleAction等).

有没有一种很好的方法将这些类组织成一个连贯的结构?

java swing actionlistener abstract-action

3
推荐指数
2
解决办法
940
查看次数

此类型定义是否处理空列表?

我正在回答Haskell的99个问题中的第七个问题.但是,我已经到了他们定义类型的地步

data NestedList a = Elem a | List [NestedList a]
Run Code Online (Sandbox Code Playgroud)

根据我的理解,它不会处理空列表(即.[]).

但是在他们的示例测试中他们表明了

*Main> flatten (List [])
[]
Run Code Online (Sandbox Code Playgroud)

这种类型是否包含空列表?如果是这样,为什么?

如果没有,并且是网站的错误,那么如何编写处理空列表的嵌套列表类型?

haskell list

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

如何处理OpenGL中的透视投影?

我目前正在使用Haskell的OpenGL绑定编写基本的渲染演示.问题是它几乎不能处理2000多个顶点.我的伪代码相当于:

terrain = The set of points generated from [-1...1] x [-1...1] x [-1...1].
camera = Camera at position (xc, yc) with angles (ax, ay, az).
while running:
    input = anything that moves the camera's position or angles
    projected = []
    for point in terrain:
        projected.append(camera.perspectiveProjection(point))
    renderPoints(projected)
Run Code Online (Sandbox Code Playgroud)

问题(我相信)是我手动将每个三维点转换为二维,然后使用OpenGL绘制这些点.

我的问题是:我应该提供OpenGL三维点,然后使用OpenGL烘焙过的任何投影吗?

(我觉得我理解透视投影是如何工作的 - 我只是不确定我是否应该手动执行此操作.)

编辑:

以下是我的代码.我已经省略了我认为只有函数定义才能解释清楚的部分.

main :: IO()
main = do
    (_progName, _args) <- getArgsAndInitialize
    initialDisplayMode $= [DoubleBuffered]
    _window <- createWindow "Hello, World"
    -- The camera position followed by pitch, yaw …
Run Code Online (Sandbox Code Playgroud)

opengl 3d graphics haskell projection

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

如何阻止随机性在Haskell中传播我的代码?

我试图实现以下算法,详见此处.

  1. 从平坦地形开始(将所有高度值初始化为零).

  2. 选择地形上或附近的随机点,以及某个预定最小值和最大值之间的随机半径.仔细选择这个最小值和最大值将使地形变得粗糙,岩石或平滑和滚动.

  3. 在具有给定半径的点上居中的地形上升起山丘.

  4. 返回步骤2,根据需要重复多次.选择的迭代次数将影响地形的外观.

然而,一旦我到达必须在地形上选择随机点的点,我就开始挣扎.这个随机点包含在IO monad中,然后传递给我的函数链.

我可以IO在某一点切断,如果是这样,我该如何找到这一点?

以下是我的(破损)代码.我将不胜感激任何关于改进/阻止随机性感染一切的建议.

type Point = (GLfloat, GLfloat, GLfloat)
type Terrain = [Point]

flatTerrain :: Double -> Double -> Double -> Double -> Terrain
flatTerrain width length height spacing =
    [(realToFrac x, realToFrac y, realToFrac z)
         | x <- [-width,-1+spacing..width], y <- [height], z <- [-length,-1+spacing..length]]

hill :: Terrain -> Terrain
hill terrain = hill' terrain 100
               where hill' terrain 0 = terrain
                     hill' terrain iterations = do
                       raised <- …
Run Code Online (Sandbox Code Playgroud)

random monads haskell

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

如何使用Haskell类型构造函数作为枚举?

我在Haskell中编写了一个使用查找表的程序.

例如.

type Table = [(Object, FilePath)]
data Object = Player { pName :: String }
Run Code Online (Sandbox Code Playgroud)

我想以一种Player可以成为查找键的方式构造它:

[(Player, "data/players"), ...]
Run Code Online (Sandbox Code Playgroud)

如果我添加了另一种Object类型Monster,我的表可能如下所示:

[(Player, "data/players"), (Monster, "data/mons"), ...]
Run Code Online (Sandbox Code Playgroud)

但是,我的a类型定义Table表明我正在查找实例化对象,实际上,我只是想检查它是否是一个类型构造函数或另一个.

我该怎么做呢?

编辑:

我想我想要这样的东西:

data ObjectType = Player | Monster | ...
Run Code Online (Sandbox Code Playgroud)

但有没有办法避免重复数据构造函数和类型构造函数?

haskell types type-constructor

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

有没有办法在Haskell中删除重复的where语句?

我在Haskell中有以下代码:

move :: Camera -> (Double, Double, Double) -> Camera
move camera (xt, yt, zt) = camera { cPosition = (x + xt, y + yt, z + zt) }
    where (x, y, z) = cPosition camera

moveForward :: Camera -> Camera
moveForward camera = move camera (-1 * sin ya, 0, -1 * cos ya)
    where (_, ya, _) = cRotation camera

moveBackward :: Camera -> Camera
moveBackward camera = move camera (sin ya, 0, cos ya)
    where (_, …
Run Code Online (Sandbox Code Playgroud)

haskell

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

为类型安全的向量实现zipWith

我正在尝试编写一个具有类型安全长度的矢量库,这意味着添加两个不同长度的矢量将无法飞行.

我目前的实施大致是:

data Natural where
  Zero :: Natural
  Succ :: Natural -> Natural

type One   = Succ Zero
type Two   = Succ One
type Three = Succ Two
type Four  = Succ Three

data Vector n e where
  Nil  :: Vector Zero e
  (:|) :: e -> Vector n e -> Vector (Succ n) e

infixr :|
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试实现,zipWith因为它将有助于实现dot产品和Num类型类之类的东西.

我已经走到了这一步

zipWith :: (a -> b -> c) -> Vector n a -> Vector n b …
Run Code Online (Sandbox Code Playgroud)

haskell types linear-algebra

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

为什么我的MVar会冻结我的代码?

我正在尝试使用Haskell创建一个简单的服务器.当客户端连接到服务器时,服务器会记录其地址.每n微秒,服务器发送一个广播.

这是服务器

data Server = Server {
  sSocket :: Socket,
  sPort :: Port,
  sClients :: MVar [ClientAddress]
  }
Run Code Online (Sandbox Code Playgroud)

(注意允许从多个线程使用客户端的MVar.)

这就是服务器的创建方式

startServer port = withSocketsDo $ do
  socket  <- listenOn $ PortNumber $ fromIntegral port
  clients <- newEmptyMVar
  let server = Server socket port clients
  forkIO $ forever $ accept socket >>= forkIO . (handleClientRequest server)
  forever $ updateClients server 1000000
Run Code Online (Sandbox Code Playgroud)

服务器使用其线程并分叉.分叉线程处理任何传入的客户端请求

handleClientRequest server client = do
  clients <- takeMVar $ sClients server
  putMVar (sClients server) (client : clients) …
Run Code Online (Sandbox Code Playgroud)

multithreading haskell client-server

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

我可以迭代Java中for循环中定义的数组吗?

Java是否提供了一种方法来执行类似下面的操作,而无需在单独的变量中声明数组?

for (String s : {"HEY", "THERE"}) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的是:

for (String s : new ArrayList<String>() {{ add("HEY"); add("THERE"); }}) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这不漂亮.

java arrays for-loop

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