是否有一种理智的方法将多态函数应用于类型的值Dynamic?
例如,我有一个类型的值,Dynamic我想应用于Just内部的值Dynamic.因此,如果值是由toDyn True我希望结果构建的toDyn (Just True).内部可能出现的不同类型的数量Dynamic不受限制.
(当涉及的类型来自封闭的宇宙时,我有一个解决方案,但这是令人不快的.)
我有一个程序使用haskell-src-exts,并提高性能我决定严格记录字段.这导致了更糟糕的表现.
这是我正在改变的完整模块:
{-# LANGUAGE DeriveDataTypeable, BangPatterns #-}
module Cortex.Hackage.HaskellSrcExts.Language.Haskell.Exts.SrcSpan(
SrcSpan, srcSpan, srcSpanFilename, srcSpanStartLine,
srcSpanStartColumn, srcSpanEndLine, srcSpanEndColumn,
) where
import Control.DeepSeq
import Data.Data
data SrcSpan = SrcSpanX
{ srcSpanFilename :: String
, srcSpanStartLine :: Int
, srcSpanStartColumn :: Int
, srcSpanEndLine :: Int
, srcSpanEndColumn :: Int
}
deriving (Eq,Ord,Show,Typeable,Data)
srcSpan :: String -> Int -> Int -> Int -> Int -> SrcSpan
srcSpan fn !sl !sc !el !ec = SrcSpanX fn sl sc el ec
instance NFData SrcSpan …Run Code Online (Sandbox Code Playgroud) 这是我认为(类型)有意义的片段,但 ghc 不喜欢。我希望类型注释的一些巧妙使用可以使它起作用,但我的实验失败了。有什么建议?
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Ex where
data T a where
T :: Functor f => (f a -> a) -> T a
foo :: (forall a . T a) -> Bool
foo (T f) = bar f
bar :: Functor f => (forall a . f a -> a) -> Bool
bar _f = True
Run Code Online (Sandbox Code Playgroud)
这很可能是不可能的,因为它相当于交换一个普遍存在的量词,但我希望。
以下两个功能非常相似.它们从[String] n元素中读取[Int]或[Float].如何计算公共代码?我不知道Haskell中支持将类型作为参数传递的任何机制.
readInts n stream = foldl next ([], stream) [1..n]
where
next (lst, x:xs) _ = (lst ++ [v], xs)
where
v = read x :: Int
readFloats n stream = foldl next ([], stream) [1..n]
where
next (lst, x:xs) _ = (lst ++ [v], xs)
where
v = read x :: Float
Run Code Online (Sandbox Code Playgroud)
我是Haskell的初学者级别,因此欢迎对我的代码发表任何评论.
我[Integer]在Haskell中创建一个序列.序列的数学定义是这样的,它重复一些正整数.在这种情况下,我想终止序列并确定有限列表的长度.
我尝试解决方案是首先从数学序列创建一个无限列表.然后我想过滤所有元素的列表,直到第一个元素重复.结果不应包括列表的重复头部.
我有两个问题/疑虑:
1)如何将列表的头部与列表中的元素匹配?2)这是解决我问题的有效方法吗?(如果需要,我稍后会添加更多关于确切序列的详细信息.现在我正在寻找一般性评论.)
我正在学习Haskell,我无法理解这个功能.我正在实施mergesort.我实现了mergesort递归函数,但我不明白这个'merge'函数在做什么.我理解命令式语言中的合并排序,但我不明白这里的语法.
merge [] ys = ys
merge xs [] = xs
merge xs@(x:xt) ys@(y:yt) | x <= y = x : merge xt ys
| otherwise = y : merge xs yt
Run Code Online (Sandbox Code Playgroud) 假设我有一个类型的列表列表:我可以旋转它(在某种意义上),以便:
[[a,b], [[b,d],
[c,d]] => [a,c]]
Run Code Online (Sandbox Code Playgroud)
对于任何尺寸列表?或者如果不可能为任意大小的列表只为6x6的大小列表