例如,我希望以下内容仅使用默认类型:
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
相匹配。
答案 0 :(得分:4)
它确实“仅使用默认类型”,这正是您获得此行为的原因!
即,默认趋向于总是使用与约束匹配的简单 st 类型。
Double
†。Integer
的意义很简单,也就是没有界限。Num
类型。通常,()
足以满足约束条件。当然,可能不足以满足您想要的语义,但这基本上只是意味着推断出的签名比您想要的更普遍。让我感到有些惊讶的是,GHCi不会将(Num a, Bounded a, Enum a) => a
的默认值设置为Int
,而是放弃了为a
的默认设置。
我通常完全避免依赖默认值。一个好的经验法则是不要使函数的参数比结果‡更具多态性(这样就可以始终从上下文中推断出参数类型),然后如果需要,只需在其中添加一个类型注释即可。 REPL中表达式的末尾。当然,这在这里也适用:
Prelude> succ minBound :: Int
-9223372036854775807
† 可以说,如果默认的Fractional
类型为Rational
,这将更符合哲学。
‡ 当然,除非您有特殊原因。转换函数可能需要在参数和结果中具有独立的多态性,但是通常仅在周围已经存在太多 类型信息且引起矛盾的情况下才需要转换函数。