Elm 0.19中remainderBy 0 100返回NaN而非Maybe Int的原因
remainderBy return NaN instead of Maybe Int? 这是个非常好的问题!Elm在设计remainderBy时选择返回NaN(作为Int类型的特殊值)而非Maybe Int,主要和它的核心设计哲学、与JavaScript的兼容性以及开发体验的权衡有关,我来具体说说:
对齐通用数值运算行为
首先要明确:Elm的remainderBy d n对应JavaScript里的n % d。在JS中,当除数为0时(比如100 % 0),结果就是NaN——Elm保留了这个行为,是为了和主流语言的数值运算逻辑保持一致,尤其是它编译到JS,需要和JS环境的数值系统顺畅交互。如果突然改用Maybe包装,反而会让熟悉其他语言的开发者感到困惑。避免过度包装带来的开发繁琐
Elm虽然推崇类型安全,但并非所有可能出错的场景都要用Maybe或Result处理。如果把所有数值运算(包括加减乘除取余)都改成返回Maybe,那日常开发中简单的数值计算都会变得非常啰嗦:你需要不断用case表达式或Maybe.map来处理可能的Nothing,这会大幅增加代码的复杂度,违背Elm追求简洁易用的目标。官方更倾向于把Maybe留给逻辑层面的可选值(比如空列表的头部),而数值运算中的“数学错误”(除以零、溢出等)则用NaN/Infinity这类特殊值来表示,让开发者根据需求自行处理。底层类型的限制
Elm的Int类型底层其实是JavaScript的Number类型(因为JS没有真正的整数类型),而Number本身就包含NaN和Infinity这些特殊值。如果要让remainderBy返回Maybe Int,就需要对整个数值运算体系做大幅调整,这会让类型系统变得复杂,也不符合Elm轻量、易上手的定位。
如果你确实需要安全的取余逻辑,完全可以自己封装一个函数来实现你想要的Maybe行为:
safeRemainderBy : Int -> Int -> Maybe Int safeRemainderBy divisor dividend = if divisor == 0 then Nothing else Just (remainderBy divisor dividend)
这样调用safeRemainderBy 0 100就会返回Nothing,safeRemainderBy 6 3(悄悄提一句,你示例里的结果应该是Just 0哦,因为3除以6的余数是0😉)就会返回Just 0。
内容的提问来源于stack exchange,提问作者IzumiSy

