gpt4 book ai didi

haskell - 优雅前奏曲(头.头)

转载 作者:行者123 更新时间:2023-12-03 06:28:04 34 4
gpt4 key购买 nike

我正在尝试将多个项目转换为 classy-prelude眼下。虽然大多数行为对我来说似乎相当简单,但 (head . head) 在简单的 2D 列表上给出了神秘的错误。

考虑以下 GHCi session :

Prelude> (head . head) [[1,2],[3,4]]
1

让我们用 ghci -XNoImplicitPreludeclassy-prelude 尝试一下:

> import ClassyPrelude
ClassyPrelude> (head . head) [[1,2],[3,4]]

<interactive>:10:1:
Couldn't match type `MinLen (Succ nat1) mono1' with `[[t0]]'
Expected type: [[t0]] -> Element mono0
Actual type: MinLen (Succ nat1) mono1 -> Element mono0
The function `head . head' is applied to one argument,
but its type `MinLen (Succ nat1) mono1 -> Element mono0'
has only one
In the expression: (head . head) [[1, 2], [3, 4]]
In an equation for `it': it = (head . head) [[1, 2], [3, 4]]

我认为 GHC 根本无法正确解析多维列表的类型。有什么方法可以帮助我而不求助于 (Prelude.head . Prelude.head)

最佳答案

正如评论中已经提到的,优雅前奏的 head函数仅适用于类型系统保证至少具有一个元素的可遍历对象,因此它不必是部分的。因为所有列表都至少有一个元素,所以您可以只使用非空列表类型:

head . head $ mlcons (mlcons 1 $ mlcons 2 $ toMinLenZero []) $ mlcons (mlcons 3 $ mlcons 4 $ toMinLenZero []) $ toMinLenZero [] :: Int
-- 1

(以ml开头的函数均来自mono-traversableMinLen模块,由classy-prelude重新导出)

如果您只想要 Prelude.head 函数的行为,可以使用 unsafeHead再次来自 mono-traversable 包并默认导出:

unsafeHead . unsafeHead [[1,2],[3,4]]
-- 1

该模块中还有 headMay,如果您想以不同的方式处理故障而不是使整个程序崩溃,可以使用它。

关于haskell - 优雅前奏曲(头.头),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027975/

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