小编JoL*_*JoL的帖子

haskell如何确定隐式foralls中类型变量的顺序?

所以我最近才了解并开始使用TypeApplications,并且想知道我们如何能够知道我们分配的类型变量.我发现的文件TypeApplications提到:

用什么顺序来实例化类型变量?

出现在foralls中的类型变量的从左到右的顺序.这是在类型变量级别完成实例化时发生的最合乎逻辑的顺序.嵌套的foralls工作方式略有不同,但在具有多个变量的单个forall位置,会发生从左到右的顺序.(见下面的嵌套泡沫).

但是我没有提到如何确定隐式foralls中类型变量的顺序.我试着查看不同的例子,-fprint-explicit-foralls看看是否有一个简单的模式,但我在不同版本的ghci中得到了不同的结果.:/

在ghci版本8.0.2中,我得到:

> :t (,,)
(,,) :: forall {c} {b} {a}. a -> b -> c -> (a, b, c)
Run Code Online (Sandbox Code Playgroud)

而在ghci版本8.4.3中,我得到:

> :t (,,)
(,,) :: forall {a} {b} {c}. a -> b -> c -> (a, b, c)
Run Code Online (Sandbox Code Playgroud)

然后,也许这只是在8.0.2中如何打印foralls的一个错误,因为否则类型应用程序似乎是从右到左用forall的变量完成的,与文档说的相反:

> :t (,,) @Bool
(,,) @Bool :: forall {c} {b}. Bool -> b -> c -> (Bool, b, c)
Run Code Online (Sandbox Code Playgroud)

那么隐式foralls中的类型变量总是按照它们在类型体中首先从左到右出现的顺序(包括约束)?

haskell ghc ghci

15
推荐指数
1
解决办法
381
查看次数

如何在Haskell中获取文件中任意表达式的类型?

:type是不够的,因为我想要的表达式可能包括本地定义的变量,如分配的事物<-,letwhere.键入的孔(用_ghc 替换表达式并用ghc加载)很接近,但是它们会给你那里接受的内容,这可能比你好奇的表达式更通用.

我以为我找到了累积奖金:type-at,但是我不能像我希望的那样让它上班.使用此文件,名为"thing.hs":

something :: ()
something = ()

main :: IO ()
main = return something
Run Code Online (Sandbox Code Playgroud)

这是我使用时得到的结果:type-at:

> :set +c
> :l thing.hs
[1 of 1] Compiling Main             ( thing.hs, interpreted )
Ok, one module loaded.
Collecting type info for 1 module(s) ... 
> :type-at thing.hs 5 8 5 13 -- "return" on last line

<no location info>: error: not an expression: ‘’
> :type-at thing.hs …
Run Code Online (Sandbox Code Playgroud)

haskell ghc ghci

9
推荐指数
2
解决办法
155
查看次数

为什么 eqT 返回 Maybe (a :~: b) 比返回 Bool 效果更好?

我做了一个变体,eqT它可以让我像其他人一样处理结果Bool来编写类似eqT' @a @T1 || eqT' @a @T2. 然而,虽然这在某些情况下效果很好,但我发现我无法eqT用它替换所有使用。例如,我想用它来写的变体readMaybe,将只是Just当它应该返回String。虽然 usingeqT允许我将类型保持为String -> Maybe a,但 usingeqT'要求类型为String -> Maybe String. 这是为什么?我知道我可以通过其他方式做到这一点,但我想知道为什么这不起作用。我想这与 GADT(a :~: b作为 GADT)的case 表达式的特殊处理有关,但这种特殊处理是什么?

这是我正在谈论的一些示例代码:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}

import Data.Typeable
import Text.Read

eqT' :: forall a b. (Typeable a, Typeable b) => Bool
eqT' = …
Run Code Online (Sandbox Code Playgroud)

haskell ghc gadt

7
推荐指数
2
解决办法
253
查看次数

为什么Common Lisp的打印输出先于换行符后跟一个空格?

Common Lisp Hyperspec页面print提到:

print就像prin1一样,除了对象的打印表示前面有换行符后跟一个空格.

这是我第一次看到这样的函数,并且在我第一次使用它时它就让我离开了,因为我从未想到具有这种通用名称的函数可能包含一个不常见的特性.

我正在寻找原因.我知道这可能仅仅是因为那是另一个常见的lisp可能会如何做到这一点,而common-lisp只是简单地采用了它,但如果是这样的话,我正在寻找其他 lisp 的设计理由.

我想这可能与确保输出总是可以read直接读取有关print.虽然我更喜欢这个换行符,但我可以猜测尾随空格可能是这样的,在流中,read可以知道它是一个对象的结尾并立即返回它而不必等待其余的流(以下prints).但是,我仍然无法弄清楚前一行换行背后的目的.

我一直在浏览HyperSpec,但我找不到提到的理由.

编辑:

我查看了Common-Lisp的前辈,特别是InterLisp,MacLisp和MacLisp的前身Lisp 1.5.

Interlisp(本pdf中的第145页)和Lisp 1.5(此pdf中的第140页)print功能打印对象后跟换行符.

似乎MacLisp引入了这种差异.我在原始参考手册中没有找到原因,我在本修订的参考手册中只找到了以下内容:

与PRIN1一样,PRINT以READ可以理解的形式输出对象到文件.但是,对象的输出前面是换行符,后跟一个空格,这样就可以重复调用PRINT,而不会让一个对象的结尾进入下一个对象的开头.

当然,原始定义中的尾部换行符就足够了,所以这个理由似乎没有用.

编辑2:

正如Rainer Joswig的回答所示,似乎这一变化出现在MacLisp之前的Lisp 1.6中.

lisp common-lisp

3
推荐指数
1
解决办法
738
查看次数

学习 Ruby 语法的最官方文档或方法是什么?

https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html,作者是 Yukihiro Matsumoto 本人,但鉴于我找不到提及&.(eg a&.b) 或&:(eg m(&:f)),好像更新的不是很多。我记得曾经有一个人试图根据 MRI 的单元测试来记录它,但由于缺乏开发人员的协作而放弃并放弃了该项目。

目前,似乎唯一的学习方法是在 StackOverflow 或某些开源 ruby​​ 项目上偶然发现新语法。

ruby mri

3
推荐指数
1
解决办法
923
查看次数

标签 统计

ghc ×3

haskell ×3

ghci ×2

common-lisp ×1

gadt ×1

lisp ×1

mri ×1

ruby ×1