gpt4 book ai didi

elm - 组成尾部和头部

转载 作者:行者123 更新时间:2023-12-01 10:38:16 26 4
gpt4 key购买 nike

Q: elm 0.15 不会让我到 (tail >> head) xs。如何优雅地解决这个问题?

module Fibonacci where

import List exposing ((::), head, map2, reverse, tail)

fibonacci : Int -> List Int
fibonacci n =
let fibonacci' n acc =
if n <= 2
then acc
else fibonacci' (n-1) ((head acc + (tail >> head) acc) :: acc)
in
fibonacci' n [1,1] |> reverse

自:

head : List a -> Maybe a
tail : List a -> Maybe (List a)

我不知道如何将 Maybe (List a) 转换为 List a

那么,有没有什么简单的方法可以在不定义新函数的情况下组合这 2 个函数?

最佳答案

从技术上讲,您想要的是 Kleisli composition在 Maybe monad 中:

import List exposing (head, tail)
import Graphics.Element exposing (show)

(>=>) : (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
f >=> g = \a -> case f a of Nothing -> Nothing
Just b -> g b

-- or: f >=> g = f >> (\x -> Maybe.andThen x g)

main = show ((tail >=> head) [1,2,3,4,5])

请注意 (>=>) 的类型与 (>>) 的类型非常相似,但是所有的返回类型 包裹在 Maybe 中。您可以通过这种方式将任意 Maybe 返回函数链接在一起(例如 tail >=> tail >=> tail >=> head)。

您不能类型安全地将 Maybe a 转换为 a,因为您别无选择,只能在给定 Nothing 时崩溃.但是,您可以Maybe (Maybe a) 值扁平化为 Maybe a:

flattenMaybe : Maybe (Maybe a) -> Maybe a
flattenMaybe mma =
case mma of Just (Just a) -> Just a
_ -> Nothing

关于elm - 组成尾部和头部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32085356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com