我试图找到一种方法来转换正常的递归表示法,如| 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) 我试图理解箭头符号,特别是它如何与Monads一起工作.使用Monads,我可以定义以下内容:
f = (*2)
g = Just 5 >>= (return . f)
Run Code Online (Sandbox Code Playgroud)
并且g
是Just 10
我如何使用箭头符号进行上述操作?
我正在研究F#中的Arrows,我想创建一个***
运算符.但是,我注意到,(***)
在函数定义中表示运算符的必要方法与F#块注释语法重叠.那么你怎么能真正表达这个呢?
我想也许,.***.
但我认为这实际上将点作为操作员的一部分,我宁愿避免.
在尝试熟悉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通常被解释为表达计算的有向无环图(DAG).我正在寻找可以使用这种关系的工具或库代码来帮助编程Arrows.
从箭头到图形,工具可以帮助可视化箭头代码.由于代码对应于计算的DAG,因此显示计算节点和输出到输入边缘的视觉表示是自然的.工具可以使用标准图形工具创建要查看和操作的图形.
是否有Arrow变换器可以增强任意计算的Arrow类,捕获>>>和***操作提供的结构,并且可以将计算作为基本Arrow操作的图形进行检查?
从图形到箭头,假设有一个DAG,其节点是箭头操作.是否有一个工具可以从这个构建整个DAG的箭头构建?
在没有找到这样的可视化工具的情况下,我用Google搜索了关于Haskell Arrows的大部分内容.我错过了什么?也许没有我想象的那么自然.
我想要的是写这样的东西:
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) 我最近读了一篇非常有趣的论文《单调类型》,其中描述了一种新的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) 这是我要参考的 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) 我试图理解约翰休斯著名的“将箭头概括为单子”中的“流作为箭头”部分。更准确地说,我有兴趣写下斐波那契流。
我稍微调整了休斯的定义:
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
我们会得到一个类似无限列表的结构。
以下是我理解“斐波那契数列”的两种方式:
一个非阻塞的无限流(类似无限列表): …
我想要创建一个元组,它包含一个箭头和一个描述箭头的字符串.如果我用函数(而不是箭头)这样做,下面的工作就像预期的那样:
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)