在Elm中有什么办法可以创建一个依赖于函数的函数,每次调用它时都会返回递增的Int函数吗? Signal.foldp几乎就在那里,但我无法找到要使用的信号!
可能我想要做的事情是荒谬的,但基本情况是我正在创建一个数据网格。我(显然,很难弄清楚如何做到这一点)需要每个细胞在榆树中都有一个唯一的ID,但并非所有细胞都可以保留到存储中。所以我希望所有人都能清空#34;单元格自动获取不同的负ID。
答案 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;想法很好。还有两个:
如果您想要一个应用程序范围的序列计数器,那么到目前为止,您可能拥有最高(或最低)的ID。模型中的变量,并将其用作函数中的参数以生成下一个ID;
如果每个ID只需要是唯一的,但您不要求它们是顺序的,您可以使用随机数生成器并为每个单元格提供UUID。那么你不必担心状态(尽管,根据Elm如何生成随机数,你可能需要保留种子)。
伊万
答案 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
更容易