标签: arrows

箭头中的可观察递归(或绑定)

我试图找到一种方法来转换正常的递归表示法,如| fib | 函数下面的箭头,保留尽可能多的递归表示法的结构.另外我想检查箭头.为此我创建了一个数据类型,其中包含每个Arrow {..}类的构造函数:

FIB:

fib 0 = 0
fib 1 = 1
fib n = fib (n-2) + fib (n-1)
Run Code Online (Sandbox Code Playgroud)

我的R数据类型,此数据类型的实例包含到相应构造函数的映射:

data R x y where
  -- Category
  Id       :: R a a
  Comp     :: R b c    -> R a b          -> R a c
  -- Arrow
  Arr      :: (a -> b) -> R a b
  Split    :: R b c    -> R b' c'        -> R (b,b') (c,c')
  Cache    :: (a -> a -> Bool) -> …
Run Code Online (Sandbox Code Playgroud)

recursion haskell arrows

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

将Monad表示法转换为箭头表示法

我试图理解箭头符号,特别是它如何与Monads一起工作.使用Monads,我可以定义以下内容:

f = (*2)
g = Just 5 >>= (return . f)
Run Code Online (Sandbox Code Playgroud)

并且gJust 10

我如何使用箭头符号进行上述操作?

monads haskell arrows

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

你能在F#中定义一个运算符(***)吗?

我正在研究F#中的Arrows,我想创建一个***运算符.但是,我注意到,(***)在函数定义中表示运算符的必要方法与F#块注释语法重叠.那么你怎么能真正表达这个呢?

我想也许,.***.但我认为这实际上将点作为操作员的一部分,我宁愿避免.

f# functional-programming arrows operators

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

为什么在Control.Arrow中没有Kleisli的Functor实例?

在尝试熟悉Control.Arrow时,我注意到Kleisli newtype似乎承认了Functor实例,例如:

instance Monad m => Functor (Kleisli m a) where
    fmap f (Kleisli k) = Kleisli $ liftM f . k
Run Code Online (Sandbox Code Playgroud)

有没有提供此实例的原因?它是否作为孤立实例存在于某个包中?

haskell arrows functor

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

查看Haskell箭头作为图形的工具

Haskell Arrows通常被解释为表达计算的有向无环图(DAG).我正在寻找可以使用这种关系的工具或库代码来帮助编程Arrows.

从箭头到图形,工具可以帮助可视化箭头代码.由于代码对应于计算的DAG,因此显示计算节点和输出到输入边缘的视觉表示是自然的.工具可以使用标准图形工具创建要查看和操作的图形.

是否有Arrow变换器可以增强任意计算的Arrow类,捕获>>>和***操作提供的结构,并且可以将计算作为基本Arrow操作的图形进行检查?

从图形到箭头,假设有一个DAG,其节点是箭头操作.是否有一个工具可以从这个构建整个DAG的箭头构建?

在没有找到这样的可视化工具的情况下,我用Google搜索了关于Haskell Arrows的大部分内容.我错过了什么?也许没有我想象的那么自然.

haskell arrows graph

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

Control.Arrow:为什么"让(a,b)=(第一,第二)"失败?

我想要的是写这样的东西:

let (a,b) = if *condition* then (first, second) else (second, first)

我发现即使是这样我也写不出来:

let (a,b) = (first,second)

它失败并出现错误:

 <interactive>:7:5:                                                                                                                          
Could not deduce (Arrow a0)                                                                                                             
from the context (Arrow a)
  bound by the inferred type for `a':
             Arrow a => a b c -> a (b, d) (c, d)
  at <interactive>:7:5-26
The type variable `a0' is ambiguous
When checking that `a' has the inferred type
  a :: forall (a :: * -> * -> *) b c d.
       Arrow a => …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming arrows

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

如何处理根据组成而变化的类型?

我最近读了一篇非常有趣的论文《单调类型》,其中描述了一种新的HM语言,该语言跟踪操作之间的单调性,因此程序员不必手动执行此操作(并且在非单调操作时会在编译时失败)传递给需要一个的东西)。

我当时认为可能可以在Haskell中对此建模,因为sfun本文描述的s似乎只是“另一个Arrow实例”,所以我着手创建一个非常小的POC。

但是,我碰到一个问题,简单地说,存在四种“音调”(由于缺乏更好的用语):单调,反调,常数(两者都是)和未知(两者都不是),它们可以转变为在组成或应用中彼此融合:

当应用两个“补声函数”时,所得的补声函数的语调应该是与两种类型都匹配的最具体的补语(本文中的“限定词收缩;图7”):

  • 如果两者都是恒定的张力,则结果应该是恒定的。
  • 如果两者都是单调的,则结果应该是单调的
  • 如果两者都是反渗透的,则结果应该是反渗透的
  • 如果一个是常数而另一个是单调的,则结果应该是单调的
  • 如果一个是常数而另一个是反渗透的,则结果应该是反渗透的
  • 如果一个是单调的而一个是反调的,则结果应该是未知的。
  • 如果其中一个未知,则结果未知。

当组成两个“音调函数”时,所得的音调函数的音调可能会翻转(本文中的“限定词组成;图6”):

  • 如果两者都是恒定的张力,则结果应该是恒定的。
  • 如果两者都是单调的,则结果应该是单调的
  • 如果两者都是反调的,则结果应该是单调的
  • 如果一个是单调的而一个是反渗透的,则结果应该是反渗透的。
  • 如果其中一个未知,则结果未知。

我有一个问题要用Haskell的类型恰当地表达这一点(语调之间的关系,以及“语调功能”的组成方式)。我最近的尝试是使用GADT,Type Families,DataKinds和许多其他类型级别的编程结构,如下所示:

{-# LANGUAGE GADTs, FlexibleInstances, MultiParamTypeClasses, AllowAmbiguousTypes, UndecidableInstances, KindSignatures, DataKinds, PolyKinds, TypeOperators, TypeFamilies #-}
module Main2 where

import qualified Control.Category
import Control.Category (Category, (>>>), (<<<))

import qualified Control.Arrow
import Control.Arrow (Arrow, (***), first)


main :: IO ()
main =
  putStrLn "Hi!"

data Tonic t a b where
  Tonic :: Tonicity t => (a -> b) -> Tonic t …
Run Code Online (Sandbox Code Playgroud)

haskell arrows type-level-computation

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

为什么互让让 ArrowApply 和 Monads 等价,不像 Arrow 和 Applicative?

这是我要参考的 SO 帖子此外,我将在该问题中使用与 OP 相同的片段,以免分离材料

众所周知的是一个ArrowApply实例产生一个单子,反之亦然:

newtype ArrowMonad a b = ArrowMonad (a () b)

instance Arrow a => Functor (ArrowMonad a) where
    fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f

instance Arrow a => Applicative (ArrowMonad a) where
   pure x = ArrowMonad (arr (const x))
   ArrowMonad f <*> ArrowMonad x = ArrowMonad (f &&& x >>> arr (uncurry id))

instance ArrowApply a => Monad (ArrowMonad a) where
    ArrowMonad m …
Run Code Online (Sandbox Code Playgroud)

monads haskell arrows category-theory applicative

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

休斯的斐波那契流

我试图理解约翰休斯著名的“将箭头概括为单子”中的“流作为箭头”部分。更准确地说,我有兴趣写下斐波那契流。

我稍微调整了休斯的定义:

data StreamProcessor a b = Get (a -> StreamProcessor a b) | 
                           Put b (StreamProcessor a b) |
                           Halt
put = Put
get = Get
Run Code Online (Sandbox Code Playgroud)

首先,我将流处理器视为可能阻塞(等待输入)的列表。那是:

  • Put :: b -> StreamProcessor a b -> StreamProcessor a b匹配(:) :: a -> [a] -> [a];
  • Halt :: StreamProcessor a b匹配[] :: [a];
  • Get :: (a -> StreamProcessor a b) -> StreamProcessor a b 帮助我们阻塞流并等待输入。

因此,如果我们删除 ,Get我们会得到一个类似列表的结构。如果我们也删除,Halt我们会得到一个类似无限列表的结构。

以下是我理解“斐波那契数列”的两种方式:

  • 一个非阻塞的无限流(类似无限列表): …

haskell arrows fibonacci frp

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

Haskell Arrows里面的元组

我想要创建一个元组,它包含一个箭头和一个描述箭头的字符串.如果我用函数(而不是箭头)这样做,下面的工作就像预期的那样:

funTimes10 = (*10)
describe10 = "times 10"

tuple10 :: (Num b) => ((b -> b), String)
tuple10 = (,) funTimes10 describe10
Run Code Online (Sandbox Code Playgroud)

我可以使用fst和访问函数,并snd获取函数的描述字符串.

但是,如果我用箭头交换功能,如下所示:

aTuple10 :: (Arrow a, Num b) => (a b b, String)
aTuple10 = (,) (arr funTimes10) describe10
Run Code Online (Sandbox Code Playgroud)
  • fst 仍然有效并返回我的箭头,但是
  • 我没有得到任何描述字符串snd.

我只收到此错误消息:

Ambiguous type variable `a0' in the constraint:
  (Arrow a0) arising from a use of `aTuple10'
Probable fix: add a type signature that fixes these type variable(s)
In the first …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming tuples arrows

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