Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

elm list comprehensions, retrieving the nth element of a list

I was trying to do a simulation of the Rubik's cube in Elm when I noticed Elm doesn't support list comprehensions. In Haskell or even Python I would write something like:

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

[2,4,6,8]

I could not find a way in Elm. The actual list comprehension I had to write was (in 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]

where fromIntegral :: (Integral a, Num b) => a -> b turns Integer into Num.

In Elm, I tried to use Arrays:

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

And I started getting difficulties with Maybe types:

Expected Type: Maybe number
Actual Type: Int

In fact, I had to look up what they were. Instead of working around the maybe, I just did something with lists:

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

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

I have no idea if that's efficient or correct, but it worked in the cases I tried.


I guess my two main questions are:

  • does Elm support list comprehensions? ( I guess just use map)
  • how to get around the maybe types in the Array example?
  • is it efficient to call head ( drop n x) to get the nth element of a list?
like image 537
john mangual Avatar asked Feb 13 '23 07:02

john mangual


1 Answers

Elm doesn't and will not support list comprehensions: https://github.com/elm-lang/Elm/issues/147

The style guide Evan refers to says 'prefer map, filter, and fold', so.. using `map:

map ((y !!).fromIntegral) x

or

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

Commenters point out that (!!) isn't valid Elm (it is valid Haskell). We can define it as either:

(!!) a n = head (drop n a), a total function.

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

like image 123
ja. Avatar answered Feb 16 '23 03:02

ja.