小编Ra *_*ead的帖子

Haskell:map runST

我有一个类型的绑定[ST s (Int, [Int])],我试图runST使用map 应用于每个元素,如下所示:

name :: [ST s (Int, [Int])] --Of Course there is a real value here
map runST name
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误信息

Couldn't match expected type `forall s. ST s b0'
    with actual type `ST s0 (Int, [Int])'
Expected type: [forall s. ST s b0]
  Actual type: [ST s0 (Int, [Int])]
In the second argument of `map', namely `name'
In the expression: map runST name
Run Code Online (Sandbox Code Playgroud)

必须有一些我误解的东西.我知道runST和函数组成,但我不确定这是否适用.

谢谢大家的时间!

haskell state-monad

14
推荐指数
3
解决办法
1016
查看次数

Haskell的代数数据类型:"伪扩展"

我正在学习haskell中的代数DT.我想要做的是创建一种新的ADT,它可以"扩展"现有的ADT.我找不到如何表达我想要的东西,有人可以采用替代模式或者提出解决方案.我希望它们是不同的类型,但复制和粘贴只是一种愚蠢的解决方案.下面的代码最能描述我正在寻找的内容.

data Power =
  Abkhazia |
  -- A whole bunch of World powers and semi-powers
  Transnistria
    deriving (Eq, Show)

data Country = 
  --Everything in Power | 
  Netural |
  Water
    deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

编辑:我认为需要一点澄清......我希望能够做到这一点(在ghci)

let a = Abkhazia :: Country
Run Code Online (Sandbox Code Playgroud)

并不是

let a = Power Abkhazia :: Country
Run Code Online (Sandbox Code Playgroud)

haskell algebraic-data-types

5
推荐指数
1
解决办法
282
查看次数

Haskell重构建议

我正在寻找以下代码的一些重构/最佳实践建议.我想尝试避免扩展,同时为不同的"版本"维护单独的模块,这些模块是互斥的.我目前的解决方案是使用一个类并使用存在量化为每个类创建一个公共类型CountrySets.

如果我使用OOP,这对我来说很容易实现,但我不能认为"功能性".

谢谢你的时间.

Province.hs

{-# LANGUAGE ExistentialQuantification, RankNTypes  #-}
module Province where

  class Country a where
    --some stuff that is not important

  data Power = 
    forall a. (Show a, Eq a, Country a) => Power a |
    Netural |
    Water

  data Unit = Unit {
    power  :: forall a. (Show a, Eq a, Country a) => a, 
    piece :: Piece

  data Piece = Tank | Plane

  data Province = Province {
    power  :: Power,
    provName :: String
  } …
Run Code Online (Sandbox Code Playgroud)

refactoring haskell functional-programming

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

在Bootstrap中修改监视的LESS变量

我使用的bootstrap定义了更少的变量,@body-bg以此为例.我创建了一个定义的颜色主题@background.要将两者粘合在一起,我会执行以下操作:

@body-bg: @background
Run Code Online (Sandbox Code Playgroud)

现在,我希望能够在颜色主题之间切换.因此我使用较少的'watch功能进行更改@background,但似乎没有将其传播到@ body-bg并且实际上切换到bootstrap默认值.

我不想做以下任何一种情况

  • less.modifyVars({ '@body-bg': '#FFFF00' })
  • less.modifyVars({ '@background': '#FFFF00', '@body-bg': '@background' })

因为还有许多其他变量@background.

这是一些测试页面.

Problem.htm

<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet/less" type="text/css" href="problem.less" />
    <script src="//cdnjs.cloudflare.com/ajax/libs/less.js/1.4.1/less.min.js#!watch" type="text/javascript"></script>
  </head>
  <body>
    <a href="#" onclick="less.modifyVars({ '@background': '#FF0000' })">Apple Style!</a>
    <a href="#" onclick="less.modifyVars({ '@background': '#FFFF00' })">Banana Style!</a>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

problem.less

@background: #FF0000;
@import "bootstrap/bootstrap.less";
@body-bg: @background;
Run Code Online (Sandbox Code Playgroud)

less twitter-bootstrap

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