Functional programming 将列表映射到已移位的self

Functional programming 将列表映射到已移位的self,functional-programming,elm,Functional Programming,Elm,我终于在elm中找到了一个很好的函数式编程入门点,天哪,我喜欢它吗,但我仍然缺乏一些关于一些概念的基本优雅 我经常发现自己编写的代码与下面的代码类似,这似乎是在做它应该做的事情,但如果有经验更丰富的人可以建议一种更简洁、更直接的方法,我相信这可以为这一策略提供一些有价值的见解 我想这可以归结为以下几点 (是向量减法运算符): 我很欣赏任何关于如何以更直接的方式实现这一结果的见解,可能是使用我还不知道的现有语言结构,或者任何关于如何通过或减轻痛苦的建议。后者可能是不可能的,但我确信前者会a)让我大

我终于在elm中找到了一个很好的函数式编程入门点,天哪,我喜欢它吗,但我仍然缺乏一些关于一些概念的基本优雅

我经常发现自己编写的代码与下面的代码类似,这似乎是在做它应该做的事情,但如果有经验更丰富的人可以建议一种更简洁、更直接的方法,我相信这可以为这一策略提供一些有价值的见解

我想这可以归结为以下几点 (
是向量减法运算符):

我很欣赏任何关于如何以更直接的方式实现这一结果的见解,可能是使用我还不知道的现有语言结构,或者任何关于如何通过
减轻痛苦的建议。后者可能是不可能的,但我确信前者会a)让我大吃一惊,b)让我挠头几次:)

谢谢你,非常感谢你用这句恰当的语言

就在我“挂断”之后,我想到了这个,但我相信这仍然可以大大改进,如果它是正确的(并且它只适用于n=1)

shiftr:List a->List a
班长名单=
让
修订版=
列表。反向列表
在里面
案例列表。总版次
没有->
列表
只是t->
[t]++(List.reverse shiftr)
如果Elm有内置函数,那么它可能会更干净

你可以通过做一些模式匹配来摆脱这些可能。下面是我的尝试,只使用模式匹配和累加器

import List exposing (map2, append, reverse)

shiftr list = 
  let shiftr' acc rest =
    case rest of
      [] -> []
      [x] -> x :: reverse acc
      (x::xs) -> shiftr' (x::acc) xs
  in shiftr' [] list

edgeDirections vectors =
  map2 (<->) vectors <| shiftr vectors
然后您的
shiftr
功能可以缩短为:

shiftr列表=
案例(初始列表、最后列表)
(只有我,只有我)->l::我
_->列表

这正是我之前看到的模式,我认为它可以应用于这里。谢谢你的演示!出于好奇,
(x::xs)
是否暗示
x
不是
?编辑:点击那个,我相信这并不意味着,这就是为什么这是有利的,明白了吗。
edgeDir : Vector -> ( Maybe Vector, List Vector ) -> ( Maybe Vector, List Vector )
edgeDir p ( v, list ) =
  case v of
    Nothing ->
      Debug.crash ("nono")

    Just vector ->
      ( Just p, list ++ [ p <-> vector ] )


edgeDirections : List Vector -> List Vector
edgeDirections corners =
  let
    last =
      List.head <| List.reverse corners
  in
    snd <| List.foldl edgeDir ( last, [] ) corners


main =
  show <| edgeDirections [ Vector -1 0, Vector 0 1, Vector 1 0 ]
shiftr : List a -> List a
shiftr list =
  let
    rev =
      List.reverse list
  in
    case List.head rev of
      Nothing ->
        list

      Just t ->
        [ t ] ++ (List.reverse <| List.drop 1 rev)


main =
  show (shiftr [ 1, 2, 3, 4 ] |> shiftr)
import List exposing (map2, append, reverse)

shiftr list = 
  let shiftr' acc rest =
    case rest of
      [] -> []
      [x] -> x :: reverse acc
      (x::xs) -> shiftr' (x::acc) xs
  in shiftr' [] list

edgeDirections vectors =
  map2 (<->) vectors <| shiftr vectors