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