当GHCi中没有给出类型时,为什么Enum操作失败?

时间:2018-08-27 06:16:43

标签: haskell enums polymorphism

例如,我希望以下内容仅使用默认类型:

console.clear();
var sortedItems;
var uniqueStartLetters;
var locales = ['en-US', 'es-ES', 'sv-SE'];
var items = ['am', 'ån', 'ao', 'na', 'ñb', 'nc' ];

sortAlphabetically = (array, locale) => {
    const sortFunc = (a, b) => a.localeCompare(b, locale, { sensitivity: 'base' });    
    return array.sort(sortFunc);
}

render = sortedItems => {
    const processedLetters = {};
    const res = sortedItems.map((item) => {
      const firstLetter = item[0].toUpperCase();

      if (!processedLetters[firstLetter]) {
        processedLetters[firstLetter] = true;
          console.log(firstLetter);
      }
      console.log(item);  
    });
}

locales.map(locale => {
    console.log('\n' + 'Using locale: ' + locale);
    sortedItems = sortAlphabetically(items, locale);
    render(sortedItems, uniqueStartLetters);
})

我希望<div class="row"> <?php $query = $con->query("SELECT * FROM agencyemployee"); while($row = mysqli_fetch_array($query)) : ?> <div class="col-md-4 col-sm-6 portfolio-item"> <div class="portfolio-caption"> <h4> <?php $name = $row['nmName']; if (isset($_GET['search'])) { $name = str_replace($_GET['search'], "<span class='search-highligh'>" . $_GET['search'] . "</span>", $name); } ?> <?php echo $name; ?> </h4> </div> </div> <?php endwhile;?> 至少与 succ mempty *** Exception: Prelude.Enum.().succ: bad argument succ minBound *** Exception: Prelude.Enum.().succ: bad argument :t succ mempty succ mempty :: (Monoid a, Enum a) => a :t succ minBound succ minBound :: (Bounded a, Enum a) => a 相匹配。

1 个答案:

答案 0 :(得分:4)

它确实“仅使用默认类型”,这正是您获得此行为的原因!

即,默认趋向于总是使用与约束匹配的简单 st 类型

  • 进行小数运算时,需要Double
  • 在执行其他任何算术运算时,整数类型也可以解决问题。选择Integer的意义很简单,也就是没有界限。
  • 在没有算术的地方,您不需要Num类型。通常,()足以满足约束条件。当然,可能不足以满足您想要的语义,但这基本上只是意味着推断出的签名比您想要的更普遍。

让我感到有些惊讶的是,GHCi不会将(Num a, Bounded a, Enum a) => a的默认值设置为Int,而是放弃了为a的默认设置。

我通常完全避免依赖默认值。一个好的经验法则是不要使函数的参数比结果更具多态性(这样就可以始终从上下文中推断出参数类型),然后如果需要,只需在其中添加一个类型注释即可。 REPL中表达式的末尾。当然,这在这里也适用:

Prelude> succ minBound :: Int
-9223372036854775807

可以说,如果默认的Fractional类型为Rational,这将更符合哲学。

当然,除非您有特殊原因。转换函数可能需要在参数和结果中具有独立的多态性,但是通常仅在周围已经存在太多 类型信息且引起矛盾的情况下才需要转换函数。