PureScript - 使用 Fat Arrow 而不是 Thin Arrow

PureScript - Using Fat Arrow instead of Thin Arrow

考虑以下 PureScript 代码,它是手册中示例的略微修改版本:

module ArrayRecursion where

import Prelude (discard, Unit)
import Data.Array (null, tail)
import Data.Maybe (fromMaybe)

length :: forall a. Array a => Int
length arr = 
  if null arr then
    0
  else
    1 + ( length $ fromMaybe [] $ tail arr)

编译此代码会产生以下错误

Unknown type class Array

所以代码无法编译。

问题:

  1. 类型class数组是从哪里导入的?它似乎不是从 PreludeData.Array.

    导入的
  2. 如何找到导入 PureScript 类型 classes 的位置?在这种情况下,在 Pursuit 中搜索“Array”会产生数百个结果,从而造成大海捞针问题。

Array 不是 类型 class,而是 类型 .

您不小心在 Array a 之后放了一个粗箭头而不是细箭头,这让您看起来像是在用约束 Array a 而不是一个 Int 类型声明一个值以 Array a 作为参数和 returns 为 Int 的函数。它应该是这样的:

length :: forall a. Array a -> Int

通常您不会导入 Array 类型。它位于名为 Prim 的模块中,该模块始终被隐式导入。

至于发现 - 是的,在 Pursuit 上搜索。如果你仔细看the search results,你会发现其中只有一个(第一个)实际上是一个类型。所有其他的都是函数或 ADT 案例。

另一种搜索内容(尤其是标准库中的内容)的方法是 IDE 集成。这些天我几乎从来不需要在我的文件顶部手动添加导入。我只是开始输入我需要的任何名称,IDE 支持为我提供了一些选项,等待我选择,并自动添加导入。 10/10 推荐。