【发布时间】:2020-05-20 04:52:19
【问题描述】:
我偶然发现了一些恼人的事情。我知道 haskell 适用于弱头范式(WHNF),我知道这是什么。在 ghci 中键入以下代码(据我所知,我正在使用命令 :sprint 将表达式简化为 WHNF。):
let intlist = [[1,2],[2,3]]
:sprint intlist
给intlist = _ 这对我来说完全有意义。
let stringlist = ["hi","there"]
:sprint stringlist
给stringlist = [_,_]
这已经让我很困惑了。但后来:
let charlist = [['h','i'], ['t','h','e','r','e']]
:sprint charlist
居然给charlist = ["hi","there"]
据我了解 Haskell,字符串只不过是字符列表,这似乎可以通过检查 "hi" :: [Char] 和 ['h','i'] :: [Char] 类型来确认。
我很困惑,因为根据我的理解,上面所有三个示例都或多或少相同(列表列表),因此应该简化为相同的 WHNF,即_。我错过了什么?
谢谢
【问题讨论】:
-
This 好像有关系
-
@Bergi 这些问题肯定是相关的,但似乎都没有解决为什么
"bla"和['b','l','a']会出现不同的结果。 -
@leftaroundabout 因为
"bla"可能被重载,但['b','l','a']已知是String/[Char]? -
@Bergi 我也想过这个问题,但这不太合理,因为
['b', 'l', 'a']可以also be overloaded,同样"bla"只有在-XOverloadedStrings开启时才会过载。 -
似乎与解析器相关,可能特定于 GHCi? (我不知道您如何在 GHC 编译的代码中测试 WHNF。)引号本身似乎是触发器。
标签: haskell functional-programming ghci reduction weak-head-normal-form