小编dfe*_*uer的帖子

为什么输入中的箭头在 proc 块中的箭头命令中不可用?

在学习箭头的过程中,我偶然发现了一个随着时间的推移并没有变得更清晰的点:

从 John Hughes 的论文“Generalizing Monads To Arrows”中,我注意到下面的情况(情况 I)是不可能的,因为参数中的箭头 f不能在箭头过程的本地范围内使用。

-- case I
proc (f,x) -> returnA <- f -< x     --- here the f is illegal   
Run Code Online (Sandbox Code Playgroud)

如果我们otherArrow在其他地方定义了另一个箭头 ,我们可以这样做:

-- case II
proc (f,x) -> returnA <- otherArrow -< x
Run Code Online (Sandbox Code Playgroud)

我理解需要类似-<没有应用箭头才能应用于x其输入。所以我们用-<它来实现这一点(案例二)。

但我不明白无法使用块参数中给出的箭头的原因proc。(fproc (f,x)案例 I 中)。

而我的不理解又和一个经常使用的术语发生了冲突:箭头命令。Papers 坚持认为它并不等同于 Haskell 表达式,并且 Haskell 类型系统不适合使箭头命令成为语言中的一流命令。

我再次不明白是什么事实/属性使它不可能在 Haskell 类型系统中成为一流的。理解这种不可能背后的原因似乎是我需要的洞察力。

鉴于罗斯帕特森论文中的语法:

exp ::=   ...
        | proc pat -> …
Run Code Online (Sandbox Code Playgroud)

haskell arrows

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

我们自己的数据类型的最大值

假设我在 haskell 中创建了自己的数据类型:

data List a = ListNode a (List a) | ListEnd
Run Code Online (Sandbox Code Playgroud)

我如何实现一个自定义的最大值函数来查找列表的最大值,例如:

 mymaximum (ListNode 10 ListEnd)
Run Code Online (Sandbox Code Playgroud)

应该返回 10

mymaximum (ListNode 20 (ListNode 10 ListEnd)) 
Run Code Online (Sandbox Code Playgroud)

将返回 20

haskell

1
推荐指数
2
解决办法
171
查看次数

哈斯克尔。匹配模式问题。无法输入带有空列表“print $ note1 []”的函数的 IO 值 - 编译失败

哈斯克尔。匹配模式问题。无法输入空列表函数的 IO 值

print $ note1 []
Run Code Online (Sandbox Code Playgroud)

无法编译,但在 ghci 中工作正常?!另外,print $ note1 [1]工作正常,编译罚款了。只有空列表的问题:

print $ note1 []
Run Code Online (Sandbox Code Playgroud)

(注意我是 Haskell 的新手)我有一个匹配的模式函数

note1          :: (Show a) => [a] -> String
note1 []       = "Empty"
note1 (x:[])   = "One"
Run Code Online (Sandbox Code Playgroud)

print $ note1 []无法编译,但在 ghci 解释器中完美运行?!

我在 MacOS 上使用 stack 2.3.1 和 ghc 8.8.3。

这是编译器产生的编译错误。

    /Users/admin1/Haskell/PROJECTS/orig1/src/Lib.hs:18:13: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘note1’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a …
Run Code Online (Sandbox Code Playgroud)

haskell

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

标准输入是如何实现的?

在任何编程语言中,当我们要求用户输入时会发生什么?

假设在 Haskell 中我们有以下代码。

name <- getLine
putStrLn ("Hey " ++ name)
 
Run Code Online (Sandbox Code Playgroud)

将如何实施 getLine会是什么样子?

假设是正确的,这以某种方式侦听键盘中断,当按下 Enter 键时,该函数停止执行?如果是这样,那么它如何等待?是否有某种while循环?

haskell operating-system

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

"可比较"的精确程度是多少?

Comparable界面看起来像

interface Comparable<T>
{
  public int compareTo(T other);
...
}
Run Code Online (Sandbox Code Playgroud)

这本身并没有说明实现Comparable<T>和类型之间的关系T.Java规范的文本似乎暗示一个实现Comparable<T>应始终是它的子类T,但据我所知,它没有明确说明.这应该是吗?此外,如果实施AComparable<T>严格的子类T,则反对称规则似乎表明,T必须是一个实现Comparable<Ap>了一些超类ApA.这是一个相当严格的要求.事实上,它是非常严格的,我认为通常不可能这样做,除非这两个类是专门为此目的而构建的.有什么想法吗?我错过了什么,或者这是一个奇怪的界面?

java

0
推荐指数
1
解决办法
48
查看次数

如何快速显示常规网格?

我想显示一个400个相同大小JPanel的网格.通常的方法似乎是创建和布局所有面板,然后实际显示它们.然而,在我的应用程序中,大多数面板实际上都是隐藏的(想想"扫雷",但面板要复杂得多),所以我希望能够显示一个"空"网格,然后将面板添加到因为我需要它们.我考虑过两种方法:

  1. 使用布局管理器进行分配,并根据需要在适当的绝对坐标处添加面板.

  2. 使用布局管理器,但开始用虚拟组件填充表格,并在我去的时候用复杂的组件替换它们.

然而,使用这些方法中的任何一种,我似乎需要提前知道面板尺寸,但事实并非如此.我可以通过构建一个示例面板并测量它来解决这个问题,但这看起来相当丑陋,并且重复了一堆代码.还有其他方法可以做到这一点吗?

java swing

0
推荐指数
1
解决办法
142
查看次数

用值替换空列表

我有一个返回如下列表的函数:

[ [1, 2, 3], [], [5], [5,6], []]
Run Code Online (Sandbox Code Playgroud)

但我想用0替换空列表,所以它看起来像这样

[ [1, 2, 3], [0], [5], [5,6], [0]]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我曾尝试filtermap收效甚微.有人可以指点我正确的方向吗?

这是有问题的代码:

knightPlace:: [Int] -> [[Int]]
knightPlace n = makeboard n

    where
    makeboard n =  [x | i<-[0..(length n -1 )], x <- [checkPos i]]
    -- checkPos add zero
    checkPos i = [j+1 | j<-[0..(length n -1 )], queenFilter n i j]
    -- filters all rows, cols and diags, also knights
    queenFilter n i j = and [n!!(i) …
Run Code Online (Sandbox Code Playgroud)

haskell replace list

0
推荐指数
1
解决办法
125
查看次数

Haskell:从列表中删除重复的元组?

我试图从前到后获得状态.是否有方便的Haskell函数从列表中删除重复的元组?或者它可能有点复杂,比如遍历整个列表?

Before: the list of tuples, sorted by word, as in
   [(2,"a"), (1,"a"), (1,"b"), (1,"b"), (1,"c"), (2,"dd")]
After: the list of sorted tuples with exact duplicates removed, as in
   [(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
Run Code Online (Sandbox Code Playgroud)

haskell tuples list

0
推荐指数
1
解决办法
1076
查看次数

为什么喂养init在Haskell中不起作用?

所以我正在写一行来获取列表的倒数第二个元素.最初我的代码是

mySLast x = last.take ((length x) - 1) x
Run Code Online (Sandbox Code Playgroud)

哪个last功能一直有效.意识到我的take业务已经包含在Haskell中,init所以我改写为

mySLast = last.init 
Run Code Online (Sandbox Code Playgroud)

这仍然不起作用.我觉得这是令人费解,因为init::[a]->[a]last::[a]->a所以他们绝对应该在组合的同态Hask类别.

我试过问Haskell它认为类型是什么,它说

ghci> :t last.init
last.init :: [c] -> c
ghci> last.init [3,2,4,1]

<interactive>:45:6:
    Couldn't match expected type ‘a -> [c]’
                with actual type ‘[Integer]’
     Relevant bindings include
       it :: a -> c (bound at <interactive>:45:1)
    Possible cause: ‘init’ is applied to too many arguments
     In the second argument of ‘(.)’, namely ‘init [3, …
Run Code Online (Sandbox Code Playgroud)

haskell list function-composition

0
推荐指数
1
解决办法
103
查看次数

$在给定的Haskell行中的功能

任何人都可以告诉我$以下Haskell线的功能.$$如果为最后一行,但功能$

  concat $ replicate 3 "12345"
Run Code Online (Sandbox Code Playgroud)

haskell

0
推荐指数
1
解决办法
71
查看次数