每次调用函数时增加一个Int?

时间:2015-10-20 15:00:35

标签: elm

在Elm中有什么办法可以创建一个依赖于函数的函数,每次调用它时都会返回递增的Int函数吗? Signal.foldp几乎就在那里,但我无法找到要使用的信号!

可能我想要做的事情是荒谬的,但基本情况是我正在创建一个数据网格。我(显然,很难弄清楚如何做到这一点)需要每个细胞在榆树中都有一个唯一的ID,但并非所有细胞都可以保留到存储中。所以我希望所有人都能清空#34;单元格自动获取不同的负ID。

5 个答案:

答案 0 :(得分:2)

榆树的副作用必须明确。

如果希望函数生效,该函数需要返回任务(或效果),并且该任务需要发送到端口以供执行。

Elm Architecture Tutorial示例6到8提供了如何使用返回效果的函数的示例(效果只是一个很好的任务接口)。

话虽这么说,如果您的网格从一开始就是固定的,您可能根本不需要折叠。您可以通过List中的简单foldl来完成。

这是一个显示的小例子。

import Html exposing (..) 


type alias Data = List (Int, Int, Bool)

type alias ID = Int

type alias TaggedData = List (ID, (Int, Int, Bool)) 

data : Data 
data = [ (0,0, True), (0,1, False)
       , (1,0, True), (1,1, False)]



toTaggedData : Data -> TaggedData
toTaggedData d =
  let 
    f (x, y, v) (pos, neg, acc) = 
      if v 
      then ((pos+1), neg, (pos, (x, y, v))::acc)
      else (pos, (neg-1), (neg, (x, y, v))::acc)
    (max, min, list) = List.foldl f (1, -1, []) d
  in 
   List.reverse list

main = text <| toString <| toTaggedData data 

答案 1 :(得分:1)

这很棘手:你希望函数秘密地保持某个状态,并在每次调用该函数时改变它。你无法在榆树中真正做到这一点:明确禁止秘密可变性。你需要在本土做一些事情。

如果要生成数据网格,每个单元格是否都有行/列索引?你能用它来生成标识符吗?

如果该建议没有帮助,那么关于您尝试做什么的更多细节可能会有所帮助: - )

答案 2 :(得分:1)

@ grumpyjames&#39;想法很好。还有两个:

  1. 如果您想要一个应用程序范围的序列计数器,那么到目前为止,您可能拥有最高(或最低)的ID。模型中的变量,并将其用作函数中的参数以生成下一个ID;

  2. 如果每个ID只需要是唯一的,但您不要求它们是顺序的,您可以使用随机数生成器并为每个单元格提供UUID。那么你不必担心状态(尽管,根据Elm如何生成随机数,你可能需要保留种子)。

  3. 伊万

答案 3 :(得分:0)

我最终的解决方案是完全放弃这个想法。现在,单元格由行和列标识,由视图函数中的嵌套indexedMap调用生成。我决定将行和列作为参数传递给Cell视图函数,而不是将它们存储在Cell模型中,因为只有父Grid真正关心单元格的行和列。

我实际上必须创建一个2D数组库作为Array(数组a)的包装器,因为必须能够获取和设置单个单元而不需要映射整个网格。

答案 4 :(得分:0)

这可能不再实际了,但是如果你为数据网格单元创建一个模块,你可以为模型添加一个计数器,并在每次调用更新时递增它:

type alias Model =
  { content : String
  , counter : Int
  }

update : Msg -> Model -> Model
update msg model =
  case msg of
    Change newContent ->
    { model | 
    content = newContent
    , counter = model.counter + 1
    }

现在在Elm 0.17信号消失了所以我想现在fwiw

更容易