首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >前奏曲(头像)(磁头)

前奏曲(头像)(磁头)
EN

Stack Overflow用户
提问于 2014-02-25 22:51:57
回答 1查看 737关注 0票数 9

目前,我正在尝试将几个项目转换为classy-prelude。虽然大多数行为在我看来都很简单,但(head . head)在一个简单的2D列表上却给出了神秘的错误。

考虑以下GHCi会话:

代码语言:javascript
复制
Prelude> (head . head) [[1,2],[3,4]]
1

让我们用ghci -XNoImplicitPreludeclassy-prelude来试试这个

代码语言:javascript
复制
> 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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 00:42:28

正如注释中已经提到的,经典前奏的head函数只适用于可遍历的,这些可遍历的类型系统至少有一个元素,因此它不必是部分的。由于所有列表中至少有一个元素,所以只需使用非空列表类型:

代码语言:javascript
复制
head . head $ mlcons (mlcons 1 $ mlcons 2 $ toMinLenZero []) $ mlcons (mlcons 3 $ mlcons 4 $ toMinLenZero []) $ toMinLenZero [] :: Int
-- 1

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

如果只想要Prelude.head函数的行为,可以从mono-traversable包中再次使用unsafeHead,并默认情况下导出:

代码语言:javascript
复制
unsafeHead . unsafeHead [[1,2],[3,4]]
-- 1

该模块中也有headMay,如果您希望以不同的方式处理故障而不让整个程序崩溃,则可以使用该模块。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22027975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档