4

当我注意到Elm不支持列表推导时,我试图在 Elm 中模拟魔方。在 Haskell 甚至 Python 中,我会写如下内容:

ghci> [2*c | c <- [1,2,3,4]]

[2,4,6,8]

我在榆树找不到路。我必须编写的实际列表理解是(在 Haskell 中):

ghci> let x = [0,1,3,2]
ghci> let y = [2,3,1,0]
ghci> [y !! fromIntegral c | c <- x]

[2,3,0,1]

fromIntegral :: (Integral a, Num b) => a -> b变成. _ Integer_Num

在 Elm 中,我尝试使用数组:

x = Array.fromList [0,1,3,2]
y = Array.fromList [2,3,1,0]
Array.get (Array.get 2 x) y

我开始在Maybe类型方面遇到困难:

Expected Type: Maybe number
Actual Type: Int

事实上,我必须查一下它们是什么。我没有解决可能的问题,而是对列表做了一些事情:

x = [0,1,3,2]
y = [2,3,1,0]

f n = head ( drop n x)
map f y

我不知道这是否有效或正确,但它在我尝试的情况下有效。


我想我的两个主要问题是:

  • Elm 支持列表推导吗?(我想只是使用map
  • 如何绕过maybe数组示例中的类型?
  • 调用head ( drop n x)获取列表的第 n 个元素是否有效?
4

2 回答 2

5

Elm 不会也不会支持列表推导:https ://github.com/elm-lang/Elm/issues/147

埃文提到的风格指南说“更喜欢地图,过滤器和折叠”,所以..使用`map:

map ((y !!).fromIntegral) x

或者

map (\i-> y !! fromIntegral i) x

评论者指出 (!!) 不是有效的 Elm(它是有效的 Haskell)。我们可以将其定义为:

(!!) a n = head (drop n a), 总函数。

也许
(!!) a n = case (head (drop n a)) of Just x -> x Nothing -> crash "(!!) index error"

于 2014-08-11T22:32:22.080 回答
3

我对 Elm 了解不多,所以我无法回答它是否支持列表推导(无论哪种方式都无法通过 Google 找到任何相关信息),但我可以回答您的另外两个问题。

如何绕过 Array 示例中的 Maybe 类型?

的类型Array.getInt -> Array a -> Maybe a,这意味着它返回NothingJust x,其中x是给定索引处的值。如果您想将其中一个操作的结果提供给另一个,在 Haskell 中您可以这样做

Array.get 2 x >>= \i -> Array.get i y

或使用 do 表示法:

do
    i <- Array.get 2 x
    Array.get i y

但是,通过快速搜索,似乎 Elm 可能支持也可能不支持所有 monadic 类型,但希望您仍然可以使用 case 语句来解决这个问题(这不是很有趣)

case Array.get 2 x of
    Nothing -> Nothing
    Just i  -> Array.get i y

事实上,我建议你写一个函数来为你做这件事,它只是Haskell中>>=for的直接克隆:Maybe

mayBind :: Maybe a -> (a -> Maybe b) -> Maybe b
mayBind Nothing  _ = Nothing
mayBind (Just x) f = f x

然后你可以用它作为

Array.get 2 x `mayBind` (\i -> Array.get i y)

调用head (drop n x)获取列表的第 n 个元素是否有效?

不,但也不是直接索引,它相当于head . drop n. 对于列表,索引总是很O(n)复杂,这意味着它需要n一些步骤才能n从列表中获取第 th 个元素。数组具有不同的结构,这使它们能够以对数时间进行索引,这明显更快。对于小列表(< 100 个元素),这并不重要,但是一旦你开始获得超过一百或一千个元素,它就会开始成为瓶颈。列表非常适合不需要最快的简单代码,因为它们通常更方便。现在,我不知道这在 Elm 中究竟是如何翻译的,可能 Elm 会将它们转换为 Javascript 数组,它们是真正的数组并且可在O(1)时间。如果 Elm 在编译后使用它自己版本的 Haskell 列表,那么您仍然会遇到减速。

于 2014-08-11T18:22:17.337 回答